我在我的应用程序中有一些web服务,我想根据webservice名称将它们记录到不同的文件.为此,我正在创建记录器
myLogger = Logger.getLogger(logKey);
Run Code Online (Sandbox Code Playgroud)
我想知道我是否应该缓存这些记录器以避免为每次调用创建它们,或者我可以忽略开销.
许多论坛和stackoverflow问题表明,创建记录器的推荐方法是按类创建它们.
快速浏览Log4j的 Logger getLogger(String name) 实现表明,所有记录器都存储在静态映射中.
我想知道我们是否在应用程序中有数千个类,并且每个类中都定义了一个记录器,这不会导致内存/性能问题.
或者,为什么我们不能在应用程序中定义一些标准记录器(基于某些功能标准)并让开发人员在类中使用它们.我知道有一个单独的记录器允许我们改变它的日志记录级别,但我相信如果有足够的预定义记录器,它不是大问题.
我查看了问题是每个类的记录器还是整个应用程序访问的一组记录器?和Log4J:创建Logger实例的策略, 但它们似乎不包括这个主题.
我现在用的是静态方式来记录(因为我觉得在Android中登录非常容易),但是现在我需要为不同的类配置不同的appender,所以静态记录方式有问题。
我阅读了Log4J: Strategies for create Logger instances,我注意到是时候更改日志记录策略了,所以我需要将以下代码添加到需要特殊记录器的类中。
private static final Logger logger  =  Logger.getLogger(XXXX.class);
Run Code Online (Sandbox Code Playgroud)
我觉得既然这是重复的工作,那么我们有什么方法可以避免在每个类中添加重复的代码,或者只是少写一些代码。AOP 或依赖注入可以做这样的工作吗?
我正在使用 log4j 和 Spring,但任何其他方法都将受到高度赞赏。
所以我研究了关于登录 Java(slf4j、log4j、logback 等)的最佳实践,似乎库之间同意记录 API 应该是什么样子。我一直阅读的建议是这样的代码,您可以在其中为每个类创建一个记录器:
class Foo{
  Logger logger = Logger.getLogger(Foo.class);
  //...
  logger.info("my log message");
  //...
}
Run Code Online (Sandbox Code Playgroud)
现在我并没有真正受益于为不同的类设置单独的记录器。为什么信息/调试/等。Logger 类中的方法不是静态的?
请不要给出诸如“好处是您可以根据类配置记录器。例如,您可以将各个类的日志级别设置为 DEBUG...”之类的回答,因为我认为这是您可以的也可以使用完全静态的 Logger 类来完成。
如果您环顾四周(例如在 stackoverflow 上:Log4J:创建 Logger 实例的策略),您会发现人们使用这样的习惯用法:
Logger.getLogger(Thread.currentThread().getStackTrace()[2].getClass().getCanonicalName());
Run Code Online (Sandbox Code Playgroud)
现在,您不必为每个类都创建一个记录器,而只需在静态(例如)info() 方法中调用上面的代码,您可以在其中确定调用类并应用所有记录器配置,就像您在其他情况下所做的一样。
那么谁能告诉我为什么有人应该为每个类使用一个记录器而不是使用一个静态记录器的真正原因?纯粹是历史原因吗?我错过了什么吗?我知道这可能会对性能产生影响,但它实际上在内存使用方面是积极的(当然在运行时方面是消极的)......
更新我想你甚至可以在静态信息/调试/等中使用这个代码。方法,它比上面的代码漂亮且性能更高:
Reflection.getCallerClass()
Run Code Online (Sandbox Code Playgroud)
然而,对该方法的支持似乎有问题 >=JDK7