在一個項目中,我使用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
預先感謝。
這並不能解決我的問題。這隻能從右到左限制組件的輸出值。我的問題是,我總是得到Utils.AppLog,我想獲得com.project.domain.Class1,com.project.dao.PersonDao等... –
我已經更新了我的答案,因爲它沒有得到第一次的問題 – Thomas
是的,我認爲這將做到這一點。但是有一個小缺點。我使用相同名稱「ApplicationLogger」來實例化記錄器,因爲這是我在log4j.properties中定義的特定記錄器,用於記錄到單獨的文件。如果我將CallingClass.class傳遞給記錄器,它將不會登錄到我想要的文件?我將用關於log4j config的信息更新主帖子。 –