SLF4J 日志级别作为参数
我们正在寻找使用 SLF4J,但我们发现的一件事是您不能将级别指定为参数,即
Logger.log(Level.INFO, "messsage");
您必须这样做,
logger.info("message");
这会阻止能够通过方法传递所有内容,因此您可以将其他属性附加到所有内容在类中记录消息。
public class Test
{
public Test(SomeObj obj)
{
log(Level.INFO, "message");
}
public void anotherMethod()
{
log(Level.DEBUG, "another message");
}
private void log(Level level, String message)
{
logger.log(level, message + obj.someString());
}
}
有没有办法使用 SLF4j 来实现这一点?
We are looking to use SLF4J, but one thing we found was that you can't specify the level as an argument, i.e
Logger.log(Level.INFO, "messsage");
You have to do this
logger.info("message");
this prevents being able to pass everything through a method, so you can tack other properties to all log messages in a class.
public class Test
{
public Test(SomeObj obj)
{
log(Level.INFO, "message");
}
public void anotherMethod()
{
log(Level.DEBUG, "another message");
}
private void log(Level level, String message)
{
logger.log(level, message + obj.someString());
}
}
Is there a way to achieve this using SLF4j ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
围绕 slf4j 调用编写一个包装器,并为六个日志级别创建您自己的枚举。然后在您的包装器中,使用开关来调用正确的 slf4j 调用。
Write a wrapper around the slf4j call and create your own enum for the six log levels. Then in your wrapper, use a switch to call the correct slf4j call.
答案是否定的。请参阅此讨论。
The answer is No. Refer to this discussion.
您的用例迫切需要委托模式。基本上,您可以在代码和 SLF4J 之间插入自己的
Logger
实现,并“扩展”相关方法:这在业务代码中使用如下:
为了实现
MyLogger
的最佳可重用性>类SomeObj
应该使用Object.toString()
或者它应该实现一个接口,MyLogger
可以使用该接口来获取消息附录。Your usecase screams for the delegation pattern. Basically you wedge your own implementation of
Logger
between your code and SLF4J and "extend" the relevant methods:This is use in the business code like this:
For optimal reusability of the
MyLogger
classSomeObj
should either useObject.toString()
or it should implement an interface whichMyLogger
can use to get the message addendum.好吧,从技术上讲,SLF4J 不为您提供 logger.log(Level, message) 方法。但我找到了解决办法。 [编辑:使用内省]
使用下面的代码片段,您可以获取 slf4j 在运行时找到并为您包装的本机记录器。如果您还记得,slf4j 只是来自另一个提供商(jdkLogging、Log4J、JCL 等)的 slf4j 实现的包装器。所以在这里:
然后你可以像这样使用它:
因此,虽然它在技术上不在 slf4j 内,但可以使用 slf4j 作为主要日志记录接口来实现。
Well, technically SLF4J doesn't offer you a logger.log(Level, message) method. But I found a way around that. [edit: uses introspection]
Using the below code snippet you can get the native logger that slf4j found and wrapped for you at runtime. If you'll recall, slf4j is simply a wrapper around an slf4j implementation from another provider (either, jdkLogging, Log4J, JCL, etc...). So here:
Then you can use it like this:
So while it's not technically within slf4j, it is possible to do it using slf4j as your primary logging interface.