Java 是否可以通过编程方式查找日志文件?

Java 是否可以通过编程方式查找日志文件?,java,logging,logback,Java,Logging,Logback,自动附加日志文件以支持电子邮件将非常有用。我可以通过编程方式设置路径(如中所示),但我更愿意让用户通过logback.xml以熟悉的方式配置日志记录。那么,我可以找到logback用于日志记录的文件吗?您可以获得特定上下文中所有appender的列表。为此: LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory(); for (Logger logger : context.getLoggerList())

自动附加日志文件以支持电子邮件将非常有用。我可以通过编程方式设置路径(如中所示),但我更愿意让用户通过
logback.xml
以熟悉的方式配置日志记录。那么,我可以找到logback用于日志记录的文件吗?

您可以获得特定上下文中所有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();
        }
    }
LoggerContext context=(LoggerContext)LoggerFactory.getILoggerFactory();
对于(记录器:context.getLoggerList()){
for(Iterator index=logger.iteratorforappendes();index.hasNext();){
Appender Appender=index.next();
}
}

这将迭代当前上下文的所有记录器中的所有追加器列表。

由@tafoo85给出的答案是正确的,但它只会给您追加器

为了更具体地获取Logback logger使用的文件,我希望下面的代码将对某些人有所帮助

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());
文件clientLogFile;
FileAppender FileAppender=null;
LoggerContext=(LoggerContext)LoggerFactory.getILoggerFactory();
对于(记录器:context.getLoggerList())
{
for(迭代器索引=logger.iteratorForAppendes();
index.hasNext();)
{
对象枚举元素=index.next();
if(FileAppender的枚举元素实例){
fileAppender=(fileAppender)枚举元素;
}
}
}
if(fileAppender!=null){
clientLogFile=新文件(fileAppender.getFile());
}
否则{
clientLogFile=null;
}
d(“日志文件路径”,clientLogFile.getAbsolutePath());

您可以这样获得实际文件:

    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());
            }
        }
    }
LoggerContext context=(LoggerContext)LoggerFactory.getILoggerFactory();
对于(ch.qos.logback.classic.Logger记录器:context.getLoggerList()){
for(Iterator index=logger.iteratorforappendes();index.hasNext();){
Appender Appender=index.next();
if(文件追加器的追加器实例){
FileAppender fa=(FileAppender)appender;
ResilientFileOutputStream rfos=(ResilientFileOutputStream)fa.getOutputStream();
File File=rfos.getFile();
System.out.println(file.getAbsolutePath());
}
}
}

对不起,我不明白这个问题。你能扩展一点吗?@Ceki:更一般地说,我能得到Logback使用的所有附加器的列表吗?这正是我所需要的,尽管我更改了行
Object enumeelement=index.next()
to
Appender enumement=index.next()
以及
fileAppender=(fileAppender)枚举元素
to
fileAppender=(fileAppender)枚举元素让它为我工作。@danial这将更具体。但是,如果您想要2-3个文件记录器(调试和跟踪),那么这段代码将非常有效。知道它现在是如何工作的吗?@user3885927确保您正在导入ch.qos.logback.classic.Logger,而不是org.slf4j.Logger!