在我的日志消息中,我需要插入生成消息的方法的名称。我看过Log4J文档和“M”和“l”转换字符,它们也有警告,比如“除非执行速度不是问题,否则生成调用者位置信息非常慢,应该避免”。所以我有(至少)两个选择:1.使用这些字符,但减慢我的代码1.手动将方法名称插入到消息中,即像log.info("myMethod: message");这样的东西会更快,但不那么优雅有没有其他方法不会减慢我的代码?谢谢你,谢谢
log.info("myMethod: message");
w41d8nur1#
我不确定你正在使用的IDE,但如果你使用的是基于Eclipse的IDE,你应该能够使用一些Java模板。这仍然会使用方法名作为字符串,但会保存您的输入时间。我创建了一整套这样的模板:
li
logger.info("${cursor}");
对于warn、error和debug,依此类推。对于方法的开始和结束,或者只是在每次注销时添加方法名称-使用如下内容:
warn
error
debug
lie
logger.info("End: ${enclosing_method}${cursor}");
等唯一的限制是你的logger ref变量必须被命名为logger。现在你只需要输入lie和(如果你在模板创建时取消选中 * 自动插入 * 复选框,可以选择点击空格。)HTH!
logger
lbsnaicq2#
我大多数时候都使用基本配置器,它默认给我方法名。因此,从技术上讲,只添加这一行代码和import语句是获得所需内容的最快方法。
BasicConfigurator.configure();
wvyml7n53#
如果有一种非慢速的方法可以通过编程方式检索此信息,log4j将使用它-不幸的是没有,因为JVM并没有设计为使运行时环境可以轻松使用此信息。这就是为什么大多数日志记录代码只使用在调试级别检索此信息的模式-然后将所有调试调用 Package 在if(logger.isDebugEnabled()) {条件中,以便仅在程序处于调试模式时检索信息。这种方法使您能够在调试时获得细粒度的运行时信息,而不会影响代码在生产中的性能。同样重要的是要记住,并非所有代码都是性能密集型的,如果您的代码在使用这些模式时运行和扩展良好,那么您也可以使用它们。如果你开始有性能问题,那么你可以重新考虑。另外,Groovy语言(从1.8版开始)有AST转换,它会自动将日志记录器(java.util,apache commons,log4j或slf 4j风格)注入到你的类中-并且还会在编译时自动将所有日志记录调用 Package 在条件中,以便它们只在日志记录处于适当级别时运行。这意味着您可以执行我上面描述的操作,而不必显式地编写条件,当然,只有在编写Groovy时才可用。
if(logger.isDebugEnabled()) {
gz5pxeao4#
如果你想在slf 4j中使用log4j,那么对于任何寻找更新解决方案的人来说,我写了一个maven-plugin来解决这个问题,同时也不会产生任何性能问题:https://github.com/PhilKes/slf4j-caller-info-maven-plugin此插件在编译时将类名、方法名和源代码行号注入SLF 4J日志语句(参见配置)。你所需要做的就是将callerInformation MDC参数添加到你的日志模式中(参见代码示例),并将插件添加到你的pom.xml中:
callerInformation
pom.xml
<plugin> <groupId>io.github.philkes</groupId> <artifactId>slf4j-caller-info-maven-plugin</artifactId> <version>1.1.0</version> <executions> <execution> <goals> <goal>inject</goal> </goals> </execution> </executions> </plugin>
4条答案
按热度按时间w41d8nur1#
我不确定你正在使用的IDE,但如果你使用的是基于Eclipse的IDE,你应该能够使用一些Java模板。这仍然会使用方法名作为字符串,但会保存您的输入时间。
我创建了一整套这样的模板:
li
logger.info("${cursor}");
对于
warn
、error
和debug
,依此类推。对于方法的开始和结束,或者只是在每次注销时添加方法名称-使用如下内容:
lie
logger.info("End: ${enclosing_method}${cursor}");
等
唯一的限制是你的logger ref变量必须被命名为
logger
。现在你只需要输入lie
和(如果你在模板创建时取消选中 * 自动插入 * 复选框,可以选择点击空格。)HTH!
lbsnaicq2#
我大多数时候都使用基本配置器,它默认给我方法名。因此,从技术上讲,只添加这一行代码和import语句是获得所需内容的最快方法。
wvyml7n53#
如果有一种非慢速的方法可以通过编程方式检索此信息,log4j将使用它-不幸的是没有,因为JVM并没有设计为使运行时环境可以轻松使用此信息。
这就是为什么大多数日志记录代码只使用在调试级别检索此信息的模式-然后将所有调试调用 Package 在
if(logger.isDebugEnabled()) {
条件中,以便仅在程序处于调试模式时检索信息。这种方法使您能够在调试时获得细粒度的运行时信息,而不会影响代码在生产中的性能。同样重要的是要记住,并非所有代码都是性能密集型的,如果您的代码在使用这些模式时运行和扩展良好,那么您也可以使用它们。如果你开始有性能问题,那么你可以重新考虑。
另外,Groovy语言(从1.8版开始)有AST转换,它会自动将日志记录器(java.util,apache commons,log4j或slf 4j风格)注入到你的类中-并且还会在编译时自动将所有日志记录调用 Package 在条件中,以便它们只在日志记录处于适当级别时运行。这意味着您可以执行我上面描述的操作,而不必显式地编写条件,当然,只有在编写Groovy时才可用。
gz5pxeao4#
如果你想在slf 4j中使用log4j,那么对于任何寻找更新解决方案的人来说,我写了一个maven-plugin来解决这个问题,同时也不会产生任何性能问题:https://github.com/PhilKes/slf4j-caller-info-maven-plugin
此插件在编译时将类名、方法名和源代码行号注入SLF 4J日志语句(参见配置)。你所需要做的就是将
callerInformation
MDC参数添加到你的日志模式中(参见代码示例),并将插件添加到你的pom.xml
中: