1
42
通常,每个类都有记录器设置,因为这是一个很好的逻辑组件。线程已经是日志消息的一部分(如果您的过滤器显示它们),因此以这种方式切片记录器可能是多余的。 关于应用程序或基于层的记录器,问题是您必须找到一个地方来放置该记录器对象。没什么大不了的。更大的问题是,一些类可以在多个应用程序的多个级别上使用…很难把你的记录器弄好。或者至少很棘手。 …您最不希望看到的是日志设置中的错误假设。 如果您关心应用程序和层,并且有简单的分离点,那么NDC就是解决问题的方法。有时代码可能有点过多,但我不知道准确的上下文堆栈保存了多少次,它向我展示了从Y层的应用程序X调用foo.bar()。 |
2
31
最常用的策略是为每个类创建一个记录器。如果您创建新的线程,给它们一个有用的名称,那么它们的日志记录就很容易区分。 为每个类创建记录器的好处是能够在类的包结构中打开/关闭日志记录:
上面将所有Apache库代码设置为
|
3
13
我敢肯定这不是一个最佳实践,但为了节省代码行,我在应用程序上节省了一些启动时间。具体来说,粘贴时:
…开发人员经常忘记将“myclass”更改为当前的类名,并且有几个记录器总是指向错误的位置。这很糟糕。 我偶尔会写:
以及:
代码中的“2”可能是错误的,但要点就在这里;进行性能测试(在类加载时,作为一个静态变量)以查找类名,这样开发人员就没有办法错误地输入或引入任何错误。 我通常不会为在运行时丢失性能以防止开发人员出错而感到兴奋,但是如果它作为单例发生,会发生一次吗?对我来说经常是个不错的交易。 |
4
10
正如其他人所说,我将为每个类创建一个记录器:
或
然而,我发现在过去,在记录器中有其他信息是有用的。例如,如果您有一个网站,您可以在每个日志消息中包含用户ID。这样,您就可以跟踪用户所做的一切(对于调试问题等非常有用)。 最简单的方法是使用MDC,但是您可以使用为类的每个实例创建的记录器,该实例的名称包括用户ID。 使用MDC的另一个优点是,如果使用SL4J,则可以根据MDC中的值更改设置。因此,如果您希望在调试级别记录某个特定用户的所有活动,并使所有其他用户都处于错误状态,则可以这样做。您还可以根据MDC将不同的输出重定向到不同的位置。 一些有用的链接: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html |
5
4
模板示例:
|
6
3
另一个选择:你可以尝试 AspectJ 测井横切。检查 here : Simplify Your Logging . (如果您不想使用 AOP 你可以看看 slf4j )
附笔: 面向方面编程 会更好的,是的 DRY(Don't Repeat Yourself) 方式。 |
7
2
创建未链接到任何类名的自定义记录器的最佳和最简单方法是:
现在,如果您需要同一类中的另一个记录器,没问题:)只需创建一个新的记录器。
现在看到上面的代码并创建新的文件附加器,这样您的输出将被发送到其他文件中。 这对(至少)2种情况有用
还有问题吗?请随便问!:) |
8
0
常见的约定是“logger pr类,并使用类名作为其名称”。这是个好建议。 我个人的经验是,这个记录器变量不应该声明为静态的,而是一个为每个新变量检索的实例变量。这允许日志框架根据两个调用来自何处对其进行不同的处理。对于该类的所有实例(在该类加载器中),静态变量都是相同的。 此外,您还应该了解您选择的日志后端的所有可能性。你可能有一些你没有预料到的可能。 |
9
0
在部署多个EAR/WARS时,最好将log4j.jar打包到类加载器层次结构中的更高层。
|
10
-1
如果您的应用程序遵循SOA原则,那么对于每个服务A,您都将拥有以下组件:
所以它使生活更容易有一个 控制日志 阿斯维克原木 原木 和persistance.log 这是基于层的分离,因此所有远程处理/REST/SOAP类都将写入acontroller.log。 您的所有调度机制、后端服务等都将写入aseservice.log。 所有任务执行都会写入AEXecutor.log等。 如果您有一个多线程的执行器,那么您可能需要使用日志累加器或其他技术来为多个线程正确地对齐日志消息。 这样的话,你总会有4个日志文件,这些文件不会太多,也不会太少,我从经验中告诉你,这会让生活变得更轻松。 |