java 是否可以以编程方式查找 logback 日志文件?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7064402/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Is it possible to find logback log files programmatically?
提问by Alexey Romanov
It would be useful to automatically attach log files to support emails. I could set the path programmatically (as in Setting Logback Appender path programmatically), but I'd prefer to let users configure logging in the familiar way via logback.xml
. So, can I find the files logback uses for logging?
自动附加日志文件以支持电子邮件会很有用。我可以以编程方式设置路径(如以编程方式设置 Logback Appender 路径),但我更愿意让用户通过logback.xml
. 那么,我能找到 logback 用于日志记录的文件吗?
回答by tafoo85
You can get the list of all appenders in a certain context. To do this:
您可以获取特定上下文中所有 appender 的列表。去做这个:
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
for (Logger logger : context.getLoggerList()) {
for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
Appender<ILoggingEvent> appender = index.next();
}
}
This iterates over the list of all appenders in all loggers for the current context.
这将迭代当前上下文的所有记录器中所有附加程序的列表。
回答by Wasim K. Memon
Answer given by @tafoo85 is correct one but it will give you appenders only.
@tafoo85 给出的答案是正确的,但它只会给你附加程序。
To more specific get file used by Logback logger i hope below code will help some one.
对于 Logback 记录器使用的更具体的 get 文件,我希望下面的代码对某些人有所帮助。
File clientLogFile;
FileAppender<?> fileAppender = null;
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
for (Logger logger : context.getLoggerList())
{
for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders();
index.hasNext();)
{
Object enumElement = index.next();
if (enumElement instanceof FileAppender) {
fileAppender=(FileAppender<?>)enumElement;
}
}
}
if (fileAppender != null) {
clientLogFile=new File(fileAppender.getFile());
}
else {
clientLogFile = null;
}
Log.d("logfile path", clientLogFile.getAbsolutePath());
回答by Ray
You can get the actual file like so:
您可以像这样获取实际文件:
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
for (ch.qos.logback.classic.Logger logger : context.getLoggerList()) {
for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext();) {
Appender<ILoggingEvent> appender = index.next();
if (appender instanceof FileAppender) {
FileAppender<ILoggingEvent> fa = (FileAppender<ILoggingEvent>)appender;
ResilientFileOutputStream rfos = (ResilientFileOutputStream)fa.getOutputStream();
File file = rfos.getFile();
System.out.println(file.getAbsolutePath());
}
}
}