我们在我们的项目中使用SLF4J + Logback组合已经有一段时间了,并且对它非常满意,但是我们的日志记录策略相当简单,使用简单的基于类的记录器并且没有像MDC或Markers这样的花哨的东西.
我想知道的是,社区中是否有人实际使用这些功能以及它们如何用于改进日志记录/过滤.
我特别感兴趣的是在哪里,为什么以及如何使用[1]标记进行记录.他们认为这是一个非常简洁的功能,可以在记录中添加语义上下文 - 例如,当一个类可能正在处理多个问题时,可以使用任务/关注特定标记来区分日志语句.
在日志记录中创建和使用标记的最佳实践,约定或策略可能是什么.
更新:我想,我真正追求的不是为什么使用标记,而是如何使用标记- 是否有一些命名标记的好方法(例如使用带空格的明文或短划线/下划线/标点符号分隔的关键字样式名称),是否应该有某种"标准名称"池,根据业务功能命名.我可以为自己解决的问题,但如果我想系统地使用这些功能并将它们介绍给开发人员团队,那么就可以制定一些可正式的指导方针......
[1] - 通过询问如何使用标记我并不是真的问如何使用API(它确实非常直接) - 我更倾向于指出如何设置使用标记一致地记录的更一般级别
我的问题是,最好的方法是跟踪应用程序管理员的异常.(出于维护目的,通知管理员抛出的异常).
对于系统用户,我认为应该捕获异常并显示相应的错误消息. 我认为,对于系统管理员来说,最好的方法是让消息系统将每个异常的详细信息作为消息发送给接收方.一旦接收方收到新的错误消息,它就会在数据库中持续显示,或者向管理员发送一封包含异常详细信息的电子邮件.
try{
....
}
catch(Exception e){
//what to do here? how to notify admin?
}
Run Code Online (Sandbox Code Playgroud) 说我有这样一个类:
public class MyClass
{
private Logger log = LoggerFactory.getLogger(MyClass.class); //org.slf4j.LoggerFactory
public void foo(Params p)
{
log.info("Foo params: " + p);
long t1 = System.currentTimeMillis();
Result r = someMethod(p);
long t2 = System.currentTimeMillis();
log.info("Foo result: " + r)
log.info("Foo time taken: + (t2-t1)/1000);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在打印此信息时,我希望能够打开和关闭不同类型的信息(参数,结果,拍摄时间).
使用日志记录级别来区分的问题是,更精细的粒度级别也包含更粗略的级别.
我怎样才能轻松设置它?
我正在使用logback进行日志记录,并且在logback.xml中我将控制台附加程序作为
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>.
Run Code Online (Sandbox Code Playgroud)
我正在努力实现这样的目标...
time thread |-**CUSTOMLOGLEVEL** xyz.class - Message.
Run Code Online (Sandbox Code Playgroud)
为什么呢 我想通过定义日志级别或其他某种指标来轻松过滤消息。
例如:搜索日志级别为“ CUSTOMLOGLEVEL”的日志。有没有办法提供自定义日志级别或任何其他指示符,它表明这是自定义生成的日志,而不是某些框架生成的日志。
我进入了创建自定义类的方向。
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.logging.CustomLayout">
<param name="argument1" value="1" />
<param name="argument2" value="2" />
</layout>
</encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)
但我不确定如何将外部输入这些参数。
如果我不清楚,请告诉我。