2010-10-28 34 views
8

Tôi đã một appender log4j định nghĩa như:Log4j - Có nhiều appenders ghi vào tập tin cùng với một trong đó luôn ghi lại

log4j.logger.com.example = DEBUG, filelog 

log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.filelog.File=c:/app.log 
log4j.appender.filelog.layout=org.apache.log4j.PatternLayout 
log4j.appender.filelog.layout.ConversionPattern=%d | %m%n 
log4j.appender.filelog.DatePattern=.dd-MM-yyyy 

Trong lớp học của tôi, tôi nhận được logger như:

Log logger = LogFactory.getLog(getClass()); 

Điều này hoạt động đúng. Tôi muốn có một trình ghi nhật ký luôn ghi nhật ký một số thư nhất định (không phải lỗi, nhưng những thứ như giao dịch mất bao lâu). Nếu tôi viết chúng tại DEBUG hoặc INFO, tôi sẽ không thấy chúng nếu mức nhật ký được thay đổi. Tôi nghĩ rằng tôi có thể thực hiện điều này bằng cách sử dụng một appender khác ghi vào cùng một tập tin.

Điều này có thể có hai ứng dụng ghi vào cùng một tệp không? Làm thế nào tôi sẽ nhận được trường hợp logger nơi tôi muốn sử dụng appender gỡ lỗi bình thường và appender giao dịch trong cùng một lớp học? Những tin nhắn này sẽ không nằm trong cùng một gói, vì vậy tôi không thể cấu hình một gói nào đó để luôn đăng nhập. Tôi sẽ phải có những appenders viết các tập tin khác nhau, hoặc tôi có thể lấy chúng cả trong các mã và có cái gì đó như:

Log alwaysLogger = LogFactory.getLog(ALWAYS); 
alwaysLogger.debug("This message will always be written regardless of the level set on the filelog appender"); 

Cập nhật tôi có thể viết thư cho hai tập tin đăng nhập khác nhau nếu cần thiết, nhưng làm thế nào tôi sẽ nhận được bản ghi nhật ký trong lớp học của tôi? Tôi không muốn cấu hình một gói/lớp để luôn luôn sử dụng một appender trên khác như các lớp học sẽ phải đăng nhập thông tin/thông báo lỗi và các giao dịch "luôn luôn" tin nhắn trong một chạy bình thường. Có cách nào để hoàn thành những gì tôi cần ngay cả khi nó ghi vào hai tệp nhật ký khác nhau không?

Trả lời

6

Tôi không nghĩ rằng log4j thực sự hỗ trợ hai ứng dụng ghi vào cùng một tệp vì vấn đề đồng bộ hóa. Đặt cược tốt nhất của bạn là, nếu có thể, hãy chuyển sang slf4j bằng cách sử dụng Logback làm hệ thống ghi phụ trợ của bạn vì Logback là người kế nhiệm của log4j và cũng hỗ trợ nhiều người viết ghi vào một tệp. Kiểm tra FileAppender và chế độ thận trọng của nó.

Cập nhật: từ mô tả của bạn, có vẻ như bạn cũng nên xem markers. Bạn chỉ cần một cá thể logger, và bạn có thể kiểm soát tốt hơn bằng cách sử dụng các dấu, bởi vì với họ về cơ bản bạn nói "câu lệnh log này có một mục đích đặc biệt, và phải được ghi lại bằng cách sử dụng một appender thích hợp". Bạn cũng có thể kiểm tra ứng dụng nhật ký additivity, thường được sử dụng khi bạn sử dụng hai hoặc nhiều ứng dụng cho một tuyên bố nhật ký.

+0

Ok, ngay cả khi tôi cần phải ghi vào một tệp riêng biệt, làm thế nào tôi có thể nhận được cả hai bản ghi nhật ký trong mã của tôi? Tôi có phải chỉ định những gói nào sẽ sử dụng một appender qua người khác không? Tôi không muốn điều đó xảy ra vì các lớp này sẽ phải ghi lại thông tin/thông báo lỗi cũng như các dòng "luôn luôn". –

+2

Điều này là chính xác. Có thể định cấu hình nhiều ứng dụng cho cùng một tệp sẽ hoạt động trong một khoảng thời gian, nhưng xoay vòng nhật ký sẽ dẫn đến một trong các ứng dụng ghi vào một tệp cũ và cuối cùng là ghi nhật ký thư bị mất. – TaninDirect

2

Theo như tôi biết, việc tạo bản ghi nhật ký bằng gói & số nhận dạng lớp học chỉ là một quy ước. Bạn được tự do tạo nhiều bản ghi nhật ký trong bất kỳ lớp nào và cung cấp cho chúng bất kỳ số nhận dạng nào.

Log alwaysLogger = LogFactory.getLog("a.b.c.ALWAYS"); 
Log sometimesLogger = LogFactory.getLog("a.b.c.SOMETIMES"); 

Để viết cho cùng một tệp, tôi chưa thử nhưng ít nhất có thể, ít nhất từ ​​một chuỗi. Bạn có thể cần phải viết appender của riêng bạn thay vì dựa vào một trong những người mặc định.

-1

Có. Bạn có thể "workaround" để có 2 appender ghi vào cùng một tập tin.

Thanh toán số này code + example:

Mọi câu hỏi đều được chào đón.

0

Tôi đã làm việc này bằng cách sử dụng AsyncAppender s. Tôi đã có appender chính của tôi mà chỉ định một tập tin để đăng nhập, và đã có người khác appender của tôi đề cập đến nó.

ví dụ:

<appender name="top" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <param name="file" value="myLog.log" /> 
</appender> 

<appender name="other" class="org.apache.log4j.AsyncAppender"> 
    <appender-ref ref="top" /> 
</appender> 

<logger name="com.example.MyCLass"> 
    <appender-ref ref="other" /> 
</logger> 

Bạn có thể thêm các bộ lọc khác hoặc bất kỳ bộ lọc nào cho các ứng dụng khác. Theo như tôi có thể nói với ứng dụng của riêng tôi, các bản ghi dường như cuộn và bộ lọc của bộ lọc ứng dụng hoạt động như mong đợi.

Các vấn đề liên quan