[英]GlassFish 3: how do you change the (default) logging format?
問題來自這里: http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format - 沒有答案。
默認的 GlassFish 3 日志記錄格式非常煩人,太長了。
[#|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... ]
這只是一個可怕的默認 IMO。 文檔只是解釋了所有字段,但沒有解釋如何更改格式: http://docs.oracle.com/cd/E18930_01/html/821-2416/abluk.ZFC3568ZE8A3D
請注意,我將 SLF4J 與我的 webapp 一起部署,它也應該采用這種格式。
您如何更改日志記錄格式?
供參考:
此處的鏈接已過時: 在 glassfish 中安裝日志格式化程序...
這里的問題尚未得到解答: 如何配置 GlassFish 日志記錄以在時間戳中顯示毫秒? ...
這里的帖子一無所獲: http://www.java.net/forum/topic/glassfish/glassfish/cant-seem-configure- ...
看起來 GlassFish 日志記錄配置本身就是一個問題。 有人可以幫忙嗎?
該解決方案似乎是第一個在此發布的SO: 在glassfish中安裝日志格式化程序
我已經將一個簡單的日志格式化程序一起攻擊(隨意調整):
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();
}
}
它甚至修復了Windows機器上的雙重換行問題。
我首先將JAR放入domain/lib/ext
中 ,但是對於較新的嘗試,無論原因是什么,我現在只得到一個ClassNotFoundException:
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.
我看了幾次嘗試的新格式,但它停止工作 - 奇怪。
我在原版GlassFish論壇帖子中附加了JAR。 我基本上只使用了我的ZIP工具並將其重命名為JAR,但這應該不是問題(?)。 如果有人讓它(再次)工作,請告訴我。
注意:我正在使用GlassFish插件來啟動/停止服務器,不知道這是否是一個問題。
請繼續在GlassFish論壇中進行任何討論: http : //www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format
PS:對不起,我需要在這里發布堆棧跟蹤,因為GF論壇有些破碎。
更新 :
擴展java.util.logging.SimpleFormatter就可以了。 GlassFish現在生成以下日志條目:
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] : [com.sun.enterprise.v3.admin.DynamicInterceptor@1a53cab6].
12:13:08,920 WARNING [null] (1) JMX MBeanServer in use: [com.sun.enterprise.v3.admin.DynamicInterceptor@1a53cab6] from index [0]
12:13:08,920 WARNING [null] (1) JMX MBeanServer in use: [com.sun.jmx.mbeanserver.JmxMBeanServer@2f740f7e] from index [1]
再次,在Windows上:沒有雙重換行。
可以根據上面的帖子更改默認日志記錄格式。 通過擴展java.util.logging.Formatter而不是com.sun.enterprise.server.logging.UniformLogFormatter可以避免上面報告的NoClassDefFoundError。
總結一下:
java.util.logging.Formatter
的自定義格式化程序 domain/lib/ext
在logging.properties
指定日志格式化程序,例如。
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.myformatter.CustomFormatter
遵循所有指南並失敗,最終在GF 3.1.2.2中為我工作的是更新logging.properties中的正確屬性,如上所述:
com.sun.enterprise.server.logging.GFFileHandler.formatter = com.myformatter.CustomFormatter
我見過的所有指南都談到了更新“處理程序”屬性,但這不是必要的。 上面的房產是我改變的唯一房產。
哦; 我的自定義格式化程序擴展了SimpleFormatter。
您需要提供自己的日志記錄實現,因為似乎沒有辦法更改glassfish。 SLF4J只是一個外觀,實際上並沒有進行任何記錄,而是將它轉發到類路徑中的記錄器。
我在我的應用程序中所做的是在此帖后用logback替換整個glassfish日志記錄。 http://hwellmann.blogspot.com/2010/12/glassfish-logging-with-slf4j-part-2.html
從 GlassFish 7.0.0-M8 開始,您可以根據需要為使用的任何處理程序切換格式化程序。 在最簡單的情況下,您可以使用SimpleFormatter並為其設置一些自定義格式。 GlassFish 文檔也得到了改進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.