Java 修改日志记录附加的log4j的最佳方法
我目前正在开发即将成为大型(功能方面的)RESTWeb服务,我希望能够很好地捕获日志,以便能够很好地了解正在发生的事情。现在,我使用log4j进行日志记录,使用以下附加设置:Java 修改日志记录附加的log4j的最佳方法,java,log4j,jboss5.x,Java,Log4j,Jboss5.x,我目前正在开发即将成为大型(功能方面的)RESTWeb服务,我希望能够很好地捕获日志,以便能够很好地了解正在发生的事情。现在,我使用log4j进行日志记录,使用以下附加设置: <!-- Appenders --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <lay
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
10:44:55,893 INFO : my.package.MyClass - I'm class message
有效负载:一些请求参数
Response:我的服务返回的一些响应
额外数据:一些额外数据
INFO[STDOUT]INFO my.package.MyClass的情况下
更新
我忘了在问题中提到我正在使用JBoss5。我认为jboss可能会将10:44:55893 INFO[STDOUT]
添加到我在log4j配置中输入的任何格式中
赏金更新
我改变了这一点:
<!-- ============================== -->
<!-- Append messages to the console -->
<!-- ============================== -->
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="Target" value="System.out"/>
<param name="Threshold" value="INFO"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
不烦人
10:44:55,893 INFO [STDOUT]
前缀问题1: 为附加器使用以下图案布局:
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p: %c - %m%n" />
调用doSomething会导致:
17:17:18,125 INFO : com.foo.TestClassA - Some message from TestClassA
Some message via the specialLogger from TestClassA
在主类的某个地方,您需要像往常一样配置log4j,例如:
DOMConfigurator.configureAndWatch("log4j.xml", 60 * 1000);
尝试使用此模式,因为它将为您提供清晰的信息:
<param name="ConversionPattern" value="%d{HH:mm:ss.SSS} %-5p %c %X %m/>
信息[STDOUT]
通常也来自log4j监听System.out。我们有一个类似的例子,应用程序本身有自己的log4j配置,因此有自己的根appender。这将记录到控制台,由JBoss log4j监听。这反过来会添加信息[STDOUT]
,就像您直接向System.out
(或ERROR[STDERR]
写入System.err
)一样
我们的解决方案是删除特定于应用程序的log4j配置,只使用JBoss写入的配置
另一种方法可能是直接写入特定于应用程序的日志文件,而不是写入控制台。在服务器环境中,您最有可能引用日志文件
对于第二部分,即自动扩展带有响应、请求等数据的日志:
在一个例子中,我们有一个用于无状态会话bean的超类,该类提供了日志记录功能,并且每个实例都有一个(可覆盖的)记录器。然后,info
等基本方法将调用记录器并自动添加所需的数据
第二种方法可以是MCD
,即将一些数据(如请求)放入线程本地MDC(基本上是一个映射),然后在模式定义中访问它们
例如,我们有几个类似的应用程序,每个应用程序都有一些类,而其他应用程序也有一些类。因此,我们需要消息来自哪个应用程序,从而将应用程序名称添加到MDC:
在代码中:MDC.put(“app.name”、“myapplication”)代码>
在log4j模式配置中:
(注意%X{app.name})
我没有测试您是否可以将请求放入MDC,然后使用:%X{request.getAttribute('xyz')}
,但是如果它只获取MDC中的值并对其调用toString()
,您可以创建如下请求包装器:
public class TestClassA
{
private static Logger specialLogger = Logger.getLogger("specialLogger");
private static Logger logger = Logger.getLogger(TestClassA.class);
public TestClassA() {
}
public void doSomething() {
logger.info("Some message from TestClassA");
specialLogger.info("Some message via the specialLogger from TestClassA");
}
}
class RequestLogWrapper {
private HttpServletRequest request; //initialize through constructor etc.
public String toString() {
return request.getAttribute("xyz") + ";" + request.getAttribute("abc") + ... //handle null etc. as well
}
}
然后调用MDC.put(“request”,新的RequestLogWrapper(request))在配置中,使用%X{request}
仅打印消息,以下转换模式即可
<param name="ConversionPattern" value="%m%n"/>
根据您的需求,您可以将转换模式设置为您想要的任何模式
%-5p表示日志条目的类型。这将出现在
将文件记录为信息、调试、错误等。从技术上讲,%p就足够了
包括本说明;在-5中包含这个词
5个字符宽的列
%d指日期
%t指向引发此日志项的线程的名称
%c列出生成此日志的类别,通常是
类名
%m显示消息
%n添加回车符
您是否只将所有相关信息放在消息中?我不确定,但这不是一个好主意。如果您不喜欢log4jxml配置文件,可以切换到属性文件。您不能使用简单属性文件配置过滤器,但因为您似乎不需要它们,所以这不应该是一个问题
既然你是
…目前正在开发即将成为大型(功能方面的)rest web服务,我希望能够很好地捕获日志,以便能够很好地了解正在发生的事情
那么,我担心您所期望的输出根本不会给您提供很多见解,它不会很好地扩展,而且一旦应用程序如预期的那样变大,它会让您失去理智
有关日志设计的良好参考,请参阅。请看所有的段落,包括最后的修饰性考虑。希望这能有所帮助。即使我使用了你建议的所有内容,我仍然无法摆脱这个恼人的“13:13:43428信息[STDOUT]”在我在appender中更改的任何内容之前,你的设置仍然有效,但只有在这一部分之后。不是JBoss而是%d{ABSOLUTE}给你10:44:55893的消息你能澄清一下设置自定义转换模式有什么不好吗?
DOMConfigurator.configureAndWatch("log4j.xml", 60 * 1000);
<param name="ConversionPattern" value="%d{HH:mm:ss.SSS} %-5p %c %X %m/>
class RequestLogWrapper {
private HttpServletRequest request; //initialize through constructor etc.
public String toString() {
return request.getAttribute("xyz") + ";" + request.getAttribute("abc") + ... //handle null etc. as well
}
}
<param name="ConversionPattern" value="%m%n"/>