开启log4j的记录源代码行号的配置,会对系统性能产生影响!

文章介绍了Java中Log4j能带出源代码行号,方便查找错误。其利用了JVM特性,JVM本身也支持Debug出行号信息。但建立运行时堆栈跟踪对JVM开销大,因此在正式环境配置Log4j的PatternLayout时,建议关掉相关参数。
今天看到一篇文章,谈Log4j对系统的效能的影响...整理如下:

一般,我们用log4j写log的时候,很习惯于如下面记录:

2005-01-11 09:57:57,816 DEBUG (BizProc.java:275) Begin to get connection...
2005-01-11 09:57:57,816 DEBUG (BizProc.java:275)   Obtain connection 2345@defd
2005-01-11 09:57:57,816 DEBUG (BizProc.java:275)   Begin transaction [TX_2015_RECV] processing...
2005-01-11 09:57:57,925 DEBUG (BizProc.java:328)     All of the values were:

这里会把Java Source Code中的行号带出来,查找错误很方便...

但,这也是问题之所在...文章中介绍,Log4j之所以可以得到行号,是用了JVM的一个特性,不知道大家有没有注意到,如果我们的Java程序在运行时出现错误,会出现下面的信息:

javax.naming.NamingException: Cannot create resource instance
 at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:189)
 at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:301)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:834)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:181)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:822)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:181)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:822)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:181)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:822)
 at org.apache.naming.NamingContext.lookup(NamingContext.java:194)
 at org.apache.naming.SelectorContext.lookup(SelectorContext.java:183)
 at javax.naming.InitialContext.lookup(InitialContext.java:347)

看到黑体字没有,原来JVM已经内嵌支持Debug出行号信息了!可是,这里是出错的时候,JVM抛出的,那为什么用 log4j.info() 的时候,也可以看到行号呢?

下面就是重点,Log4j中记录行号的过程...

(1) 调用了 log4j.info() 或是log4j.debug()方法...
(2) 建立一个Throwable的对象来取得当前运行堆栈的快照...Throwable.fillInStackTrace();
(3) 从抛出的Throwable对象中,来分析出当前log信息的行号...

但是,请注意,建立运行时的堆栈跟踪,对JVM来说,是一项非常大的开销!

所以,我们在配置log4j的PatternLayout的时候,如果是要上线到正式环境,一定要记者把参数关掉,
一般来说,用 “%d %-5p  %m%n" 就可以满足了!


原文请参考这里: Sneaky, sneaky Log4J

===========================================================================
补遗篇~~~~~!

log4j.rootLogger=info, Console
log4j.logger.net.csdn.blog.xport=debug, RollingFile
log4j.additivity.net.csdn.blog.xport=false

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d %-5p [%t] %C{1} - %m%n

log4j.appender.RollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.RollingFile.File=SystemLog.log
log4j.appender.RollingFile.Append=true
log4j.appender.RollingFile.MaxFileSize=2MB
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d %-5p [%t] %C{1} - %m%n

<think> 首先,用户的问题是关于Log4j的Appender配置中,如何显示行号配置conversionPattern。用户引用了多个站内引用,这些引用提供了Log4j配置的相关信息。 关键引用: - 引用[4]:详细讲解了ConversionPattern的选项,包括%L表示输出语句所在的行号。 - 引用[5]:也提到了%d用于日期,但没有直接提到行号。 - 引用[2]和[3]:提到了ConversionPattern的用法,但具体到行号,引用[4]最相关。 用户的具体问题:“我想查找log4j的Appender配置中,要显示行号时conversionPattern的配置方法 请问log4j Appender配置显示行号时conversionPattern的配置方法” 所以,我需要基于引用[4]来回答,因为它明确指出%L用于输出行号。 回答结构: - 根据系统级指令,使用中文回答。 - 确保LaTeX语法正确:行内数学表达式用$...$,独立公式用$$...$$并单独成段。但由于这个问题涉及配置语法,可能不需要LaTeX,除非有数学相关内容。我会在必要时使用。 - 回答要清晰,逐步解决问题。 - 末尾自然地添加引用标识。 - 生成相关问题。 步骤: 1. **确认配置方法**:从引用[4]可知,要显示行号,需要在ConversionPattern中使用%L。ConversionPattern是一个字符串,指定日志消息的格式。 2. **示例配置**:提供一个示例conversionPattern字符串,包括%L。 3. **完整配置示例**:给出一个完整的Appender配置示例,比如FileAppender或ConsoleAppender。 4. **解释**:简要解释%L的作用。 5. **引用**:在回答末尾添加引用标识。 6. **生成相关问题**:列出2-3个相关问题。 回答大纲: - 开头直接回答问题。 - 解释%L的用法。 - 提供一个配置示例。 - 添加引用。 - 生成相关问题。 完整回答: 在Log4j的Appender配置中,要显示行号(即日志输出中包含代码行号),可以通过在`ConversionPattern`参数中使用`%L`选项来实现。`%L`表示输出日志语句所在的代码行号。 例如,对于一个FileAppender的配置,可以这样设置: ``` log4j.appender.FILE.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %m%n ``` 在这个模式中: - `%d{yyyy-MM-dd HH:mm:ss}`:输出时间戳。 - `[%t]`:输出线程名。 - `%-5p`:输出日志级别(如DEBUG, INFO),左对齐占5位。 - `%c{1}`:输出日志记录器的名称(简化为类名)。 - `%L`:输出行号。 - `- %m%n`:输出日志消息和换行符。 这样配置后,日志输出将包括代码行号,便于调试时定位问题。 参考引用[4]提供了更多ConversionPattern选项的详细讲解。[^4] §§相关问题§§ 1. Log4j中如何配置日志输出到多个目的地? 2. Log4j的ConversionPattern中其他常用选项有哪些? 3. 在Log4j中如何自定义布局(Layout)? 确保LaTeX:这里没有数学公式,所以不需要LaTeX。如果需要,比如解释百分比,但这里简单文本就够了。 引用处理:在回答末尾添加[^4],因为主要引用是引用[4]。用户提供了多个引用,但引用[4]最相关。 </think> 基于您的查询和提供的引用信息,我来详细解释Log4j Appender配置中显示代码行号(Line Number)的`conversionPattern`配置方法。Log4j通过`ConversionPattern`参数定义日志输出的格式,其中行号使用`%L`选项实现。以下是逐步说明: ### 1. **核心配置方法** 在Log4j的Appender配置中(如`FileAppender`或`ConsoleAppender`),需在`layout.ConversionPattern`参数中添加`%L`选项。该选项会输出日志语句在源代码中的行号(Line Number)。 - **语法格式**: ```properties log4j.appender.[Appender名称].layout.ConversionPattern = [其他选项]%L[其他选项] ``` 其中: - `%L`:固定占位符,表示输出代码行号(例如,Java源文件中的行号)。 - 其他选项:可组合日期(`%d`)、日志级别(`%p`)、类名(`%c`)等(参考引用[4])。 - **注意事项**: - `%L`要求在编译时启用了调试信息(如Java的`-g`编译选项),否则可能输出`?`。 - 行号是运行时动态获取的,略微增加性能开销,适用于开发和调试环境(引用[4])。 ### 2. **完整配置示例** 以下是典型配置示例,以`FileAppender`显示行号为例: ```properties # 定义FileAppender的名称(例如FILE) log4j.appender.FILE = org.apache.log4j.FileAppender log4j.appender.FILE.File = application.log # 设置Layout(例如PatternLayout) log4j.appender.FILE.layout = org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n ``` - **参数解析**: - `%d{yyyy-MM-dd HH:mm:ss}`:输出精确时间戳。 - `[%t]`:输出线程名。 - `%-5p`:输出日志级别(如INFO),左对齐占5字符。 - `%c`:输出类名。 - `%L`:**关键行号选项**。 - `%m`:输出日志消息。 - `%n`:换行符。 - **输出示例**: `2023-10-05 14:30:00 [main] INFO com.example.MyClass:42 - 用户登录成功` 其中`:42`表示日志语句在`MyClass.java`的第42行。 ### 3. **其他常见组合** 若需增强可读性或添加其他信息,可调整模式字符串: - **简单模式**(仅行号和消息): `log4j.appender.CONSOLE.layout.ConversionPattern = [Line:%L] %m%n` - **详细模式**(含文件名`%F`和行号`%L`): `log4j.appender.FILE.layout.ConversionPattern = %F:%L - %m%n`(输出示例:`MyClass.java:42 - 用户登录成功`) ### 性能与最佳实践 - **性能影响**:`%L`需解析调试信息,建议在生产环境中禁用(改用日志级别过滤)。 - **兼容性**:适用于Log4j 1.x(引用[2][4]);对于Log4j 2.x,需使用`%L`或`%line`(语法类似)。 以上配置基于Log4j 1.x标准实现,确保编译时启用调试信息即可生效(引用[4])。[^4]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值