2012-03-07 38 views
11

Câu hỏi bắt nguồn từ đây: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format - không có câu trả lời.GlassFish 3: làm thế nào để bạn thay đổi định dạng ghi (mặc định)?

Định dạng ghi nhật ký GlassFish 3 mặc định rất khó chịu, quá dài.

[#|2012-03-02T09:22:03.165+0100|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=113;_ThreadName=AWT-EventQueue-0;| MESSAGE... ] 

Đây chỉ là IMO mặc định khủng khiếp. Tài liệu chỉ giải thích tất cả các trường, nhưng không phải cách thay đổi định dạng: http://docs.oracle.com/cd/E18930_01/html/821-2416/abluk.html

Lưu ý rằng tôi triển khai SLF4J cùng với webapp của tôi cũng nên chọn định dạng.

Làm cách nào để thay đổi định dạng ghi nhật ký?

FYI:

Các liên kết ở đây là lỗi thời: Install log formater in glassfish ...

Câu hỏi đặt ra ở đây chưa được trả lời: How to configure GlassFish logging to show milliseconds in timestamps? ...

Việc niêm yết ở đây dẫn đến không có gì: http://www.java.net/forum/topic/glassfish/glassfish/cant-seem-configure- ...

Dường như cấu hình ghi nhật ký GlassFish là vấn đề của riêng nó. Mọi người có thể trợ giúp không?

+0

Trùng lặp: [http://stackoverflow.com/questions/9556503/reducing-line-width-of-glassfish-log](http://stackoverflow.com/questions/9556503/reducing-line-width-of -glassfish-log) – TPete

+0

Thực sự chỉ trao đổi định dạng có vẻ nhẹ hơn nhiều, hãy xem liên kết "FYI" đầu tiên mà tôi đăng, tác phẩm này, nhưng rõ ràng là tôi đã bỏ lỡ nó. – Kawu

+0

Lưu ý rằng định dạng ghi nhật ký không được chọn cho con người nhưng đối với trang Quản trị có thể thực hiện tất cả các loại nội dung lạ mắt bằng nhật ký. Nếu bạn thay đổi định dạng ghi nhật ký, bạn sẽ phá vỡ trang Quản trị. –

Trả lời

4

Các giải pháp có vẻ là người đầu tiên SO đăng ở đây: Install log formater in glassfish

Tôi đã bị tấn cùng một định dạng log đơn giản (điều chỉnh theo ý muốn):

import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.logging.LogRecord; 
import java.util.logging.SimpleFormatter; 

public class JBossAS7LikeFormatter extends SimpleFormatter 
{ 
    private final String nl = System.getProperty("line.separator"); 
    private final DateFormat df = new SimpleDateFormat("HH:mm:ss,SSS"); 

    @Override 
    public synchronized String format(LogRecord lr) 
    { 
     StringBuffer sb = new StringBuffer(); 

     // time only 
     Date dt = new Date(); 
     dt.setTime(lr.getMillis()); 

     sb.append(df.format(dt)); 
     sb.append(" "); 

     // level (longest is "WARNING" = 7 chars, space fill for level output) 
     String level = lr.getLevel().getName(); 

     int numSpaces = 7 - level.length(); 

     sb.append(level); 

     for (int i = 0 ; i < numSpaces + 1 ; i++) 
     { 
      sb.append(" "); 
     } 

     // package 
     sb.append("["); 
     sb.append(lr.getSourceClassName()); 
     sb.append("] "); 

     // thread (name?) 
     sb.append("("); 
     sb.append(lr.getThreadID()); 
     sb.append(") "); 

     // message 
     sb.append(formatMessage(lr)); 
     sb.append(nl); 

     // optional stack trace 
     if (lr.getThrown() != null) 
     { 
      try 
      { 
       StringWriter sw = new StringWriter(); 
       PrintWriter pw = new PrintWriter(sw); 
       lr.getThrown().printStackTrace(pw); 
       pw.close(); 
       sb.append(sw.toString()); 
      } 
      catch (Exception e) 
      { 
      } 
     } 

     return sb.toString(); 
    } 

} 

Nó thậm chí sửa chữa vấn đề xuống dòng đôi trên các máy Windows.


tôi để làm việc này bằng cách đặt JAR vào domain/lib/exttại đầu tiên, nhưng đối với cố gắng mới hơn, bất kể lý do là, tôi chỉ giữ được một ClassNotFoundException bây giờ:

Mrz 08, 2012 9:39:14 AM com.sun.enterprise.admin.launcher.GFLauncherLogger info 
Information: Successfully launched in 5 msec. 
Launching GlassFish on Felix platform 
Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishMain.main(GlassFishMain.java:97) 
    at com.sun.enterprise.glassfish.bootstrap.ASMain.main(ASMain.java:55) 
Caused by: java.lang.NoClassDefFoundError: com/sun/enterprise/server/logging/UniformLogFormatter 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:410) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    at java.util.logging.LogManager.getFormatterProperty(LogManager.java:1048) 
    at java.util.logging.StreamHandler.configure(StreamHandler.java:76) 
    at java.util.logging.StreamHandler.<init>(StreamHandler.java:94) 
    at java.util.logging.ConsoleHandler.<init>(ConsoleHandler.java:88) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at java.lang.Class.newInstance0(Class.java:372) 
    at java.lang.Class.newInstance(Class.java:325) 
    at java.util.logging.LogManager$3.run(LogManager.java:419) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.util.logging.LogManager.loadLoggerHandlers(LogManager.java:405) 
    at java.util.logging.LogManager.initializeGlobalHandlers(LogManager.java:1076) 
    at java.util.logging.LogManager.access$1100(LogManager.java:148) 
    at java.util.logging.LogManager$RootLogger.getHandlers(LogManager.java:1157) 
    at java.util.logging.Logger.log(Logger.java:521) 
    at com.sun.logging.LogDomains$1.log(LogDomains.java:372) 
    at java.util.logging.Logger.doLog(Logger.java:543) 
    at java.util.logging.Logger.log(Logger.java:587) 
    at com.sun.enterprise.server.logging.LogManagerService.postConstruct(LogManagerService.java:354) 
    at com.sun.hk2.component.AbstractCreatorImpl.inject(AbstractCreatorImpl.java:131) 
    at com.sun.hk2.component.ConstructorCreator.initialize(ConstructorCreator.java:91) 
    at com.sun.hk2.component.AbstractCreatorImpl.get(AbstractCreatorImpl.java:82) 
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:67) 
    at com.sun.hk2.component.EventPublishingInhabitant.get(EventPublishingInhabitant.java:139) 
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:78) 
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:229) 
    at com.sun.enterprise.v3.server.AppServerStartup.doStart(AppServerStartup.java:145) 
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:136) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishImpl.start(GlassFishImpl.java:79) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishDecorator.start(GlassFishDecorator.java:63) 
    at com.sun.enterprise.glassfish.bootstrap.osgi.OSGiGlassFishImpl.start(OSGiGlassFishImpl.java:69) 
    at com.sun.enterprise.glassfish.bootstrap.GlassFishMain$Launcher.launch(GlassFishMain.java:117) 
    ... 6 more 
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.server.logging.UniformLogFormatter 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 53 more 
Completed shutdown of GlassFish runtime 
Command start-domain failed. 
The DAS was stopped. 

tôi thấy định dạng mới cho một vài lần thử, nhưng nó ngừng hoạt động - lạ.

Tôi đã đính kèm JAR như trong bài đăng trên diễn đàn GlassFish ban đầu của tôi. Tôi đã về cơ bản chỉ sử dụng công cụ ZIP của tôi và đổi tên nó thành JAR, nhưng điều này không phải là một vấn đề (?). Nếu có ai đó làm việc (một lần nữa) xin vui lòng cho tôi biết.

Lưu ý: Tôi đang sử dụng plugin GlassFish để khởi động/dừng máy chủ, không biết đây có phải là vấn đề hay không.

Hãy tiếp tục bất kỳ cuộc thảo luận trong diễn đàn GlassFish đây: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format

PS: xin lỗi tôi cần phải đăng stack trace ở đây là diễn đàn GF là hơi bị hỏng.

CẬP NHẬT:

Mở rộng java.util.logging.SimpleFormatter đã làm các trick. GlassFish hiện tạo các mục nhập nhật ký như:

12:13:02,400 INFO [com.sun.enterprise.web.WebContainer] (1) WEB0172: Virtual server [server] loaded default web module [] 
12:13:07,700 INFO [org.hibernate.validator.util.Version] (1) Hibernate Validator 4.2.0.Final 
12:13:08,919 WARNING [null] (1) Multiple [2] JMX MBeanServer instances exist, we will use the server at index [0] : [[email protected]]. 
12:13:08,920 WARNING [null] (1) JMX MBeanServer in use: [[email protected]] from index [0] 
12:13:08,920 WARNING [null] (1) JMX MBeanServer in use: [[email protected]] from index [1] 

Một lần nữa, trên Windows: không có dòng mới kép.

1

Bạn cần cung cấp triển khai ghi nhật ký của riêng mình vì dường như không có cách nào để thay đổi đồ thủy tinh. SLF4J chỉ là một mặt tiền và không thực sự thực hiện bất kỳ thao tác ghi nào, nó chuyển tiếp nó tới logger hiện có trên classpath của bạn.

Những gì tôi đã thực hiện trong ứng dụng của mình là thay thế toàn bộ hoạt động đăng nhập bằng thủy tinh với đăng nhập sau bài đăng này. http://hwellmann.blogspot.com/2010/12/glassfish-logging-with-slf4j-part-2.html

+0

Có một lợi thế khi sử dụng java.util.logging, cụ thể là nó sẽ hoạt động ngay cả trên các trình nạp lớp. –

3

Định dạng ghi mặc định có thể được thay đổi theo bài đăng ở trên. Các NoClassDefFoundError báo cáo ở trên có thể tránh được bằng cách mở rộng java.util.logging.Formatter chứ không phải là com.sun.enterprise.server.logging.UniformLogFormatter.

Để tóm tắt:

  1. Thực hiện một định dạng tùy chỉnh kéo dài java.util.logging.Formatter
  2. Sao chép jar chứa định dạng tùy chỉnh để domain/lib/ext
  3. Xác định định dạng đăng nhập logging.properties, ví dụ.

    com.sun.enterprise.server.logging.GFFileHandler.formatter=com.myformatter.CustomFormatter 
    
1

Tiếp theo tất cả các hướng dẫn và thất bại, những gì cuối cùng đã này để làm việc cho tôi trong GF 3.1.2.2 là để cập nhật các tài sản đúng trong logging.properties như đã giải thích ở trên:

com. sun.enterprise.server.logging.GFFileHandler.formatter = com.myformatter.CustomFormatter

Tất cả các hướng dẫn tôi đã thấy đã nói về việc cập nhật thuộc tính "trình xử lý", nhưng điều này không cần thiết. Thuộc tính trên là tài sản duy nhất tôi đã thay đổi.

Oh; và trình định dạng tùy chỉnh của tôi mở rộng SimpleFormatter.

Các vấn đề liên quan