2014-04-04 56 views
0

在一個項目中,我使用slf4j和log4j作爲基礎日誌記錄庫。 我希望我的日誌事件擁有註冊事件的包和類名稱。一些小事如:com.project.MyClass。Log4j輸出完整的類名和包

我知道,通常情況下,我可以使用%c或%C轉換字符來實現這一點,但在這種特定情況下我不能。我的日誌事件必須以特定格式顯示一些固定數量的值。我不想在每次調用時寫入特定的格式,因此我創建了一個包含Logger作爲靜態變量的包裝類。在這個包裝類中,我創建了必要的方法來記錄適當的格式,例如info,debug和error。下面是代碼的示例:

public final class AppLog { 
     private static final Logger APP_LOGGER = LoggerFactory.getLogger("ApplicationLogger"); 

     public static void info(String... args) { 
      AppLog.APP_LOGGER.info(LogsUtils.generateLogString(args)); 
     } 
     ... 
    } 

的問題是,使用%c或%C轉換字符時,它們總是輸出com.project.WrapperClass作爲記錄該事件的類。考慮到上面的代碼: 我的AppLog類在Utils包中。我的日誌事件總是打印Utils.AppLog作爲日誌被註冊的包和類,但我希望它打印出名爲我的AppLog類的類名。它總是會打印:

2014-04-04|10:57:16,057|ERROR|utils.AppLog 
2014-04-04|10:57:16,060|ERROR|utils.AppLog 
2014-04-04|11:11:04,708|INFO |utils.AppLog 

,我想這

2014-04-04|10:57:16,057|ERROR|com.project.domain.Person 
2014-04-04|10:57:16,060|ERROR|com.project.dao.PersonDAO 
2014-04-04|11:11:04,708|INFO |com.service.PersonService 

一個解決方案來解決,這是在我的包裝類每次調用信息方法注入class.getName()。但這對我來說似乎是一個非常骯髒的解決方案。有沒有其他解決方案來解決我沒有看到的問題?

Log4j配置:

log4j.appender.APPLICATION=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.APPLICATION.file=${log.path}application.log 
... 
log4j.logger.ApplicationLogger=DEBUG, APPLICATION 
log4j.additivity.ApplicationLogger=false 

預先感謝。

回答

1

修訂答:

對不起,我沒有得到問題的權利。我以前的回答完全錯了;

因此,您的問題在於您在使用記錄器(使用LoggerFactory)時始終使用相同的名稱ApplicationLogger。 這個記錄器無法找到AppLog對象的調用類,因爲沒有引用它。正如你所說,你可以在每個通話中注入記錄器名稱,但它很難維護。

你可以嘗試的是包裝Logger類。

public final class AppLogger { 

    private Logger logger;  

    protected AppLogger(String loggerName) { 
     this.logger = LoggerFactory.getLogger(loggerName); 
    } 

    public static AppLogger getAppLogger(String loggerName) { 
     return new AppLogger(loggerName); 
    } 

    public void info(String... args) { 
     this.logger.info(LogsUtils.generateLogString(args)); 
    } 
    ... 
} 

在每個班級中,請勿使用LoggerFactory,而應使用自己的班級。

private static final AppLogger APP_LOGGER = AppLogger.getLogger(CallingClass.class) 

,然後登錄這樣

APP_LOGGER.info("message"); 

然後在你的佈局圖案使用%C(而不是%C),並預期它應該工作!

+0

這並不能解決我的問題。這隻能從右到左限制組件的輸出值。我的問題是,我總是得到Utils.AppLog,我想獲得com.project.domain.Class1,com.project.dao.PersonDao等... –

+0

我已經更新了我的答案,因爲它沒有得到第一次的問題 – Thomas

+0

是的,我認爲這將做到這一點。但是有一個小缺點。我使用相同名稱「ApplicationLogger」來實例化記錄器,因爲這是我在log4j.properties中定義的特定記錄器,用於記錄到單獨的文件。如果我將CallingClass.class傳遞給記錄器,它將不會登錄到我想要的文件?我將用關於log4j config的信息更新主帖子。 –