Cảm ơn hveiga đã theo dõi và đăng giải pháp của bạn, điều đó rất hữu ích. Tôi muốn nói rằng bạn có thể tránh giải pháp lọc của mình bằng cách thêm 'tuyến đường' thứ hai định tuyến tất cả thư không có giá trị cho khóa định tuyến của bạn như được giải thích tại đây: http://logging.apache.org/log4j/2.x/faq.html#separate_log_files
Vì vậy, cấu hình log4j được cập nhật của bạn sẽ trông như thế này.
<appenders>
<appender name="applicationAppender" type="RollingFile" fileName="${logFileName}" filePattern="${logFileNamePattern}" bufferedIO="true" immediateFlush="true" append="true">
<layout type="PatternLayout" pattern="${logPattern}" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="${logFileSize}" />
</Policies>
<DefaultRolloverStrategy max="${logFileCount}" />
</appender>
<Routing name="contextSpecificAppender">
<Routes pattern="$${ctx:contextId}">
<Route>
<appender name="Rolling-${ctx:contextId}" type="RollingFile" fileName="logs/${ctx:contextId}.log" filePattern="${logFileNamePattern}" bufferedIO="true" immediateFlush="true" append="true">
<layout type="PatternLayout" pattern="${logPattern}" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="${logFileSize}" />
</Policies>
<DefaultRolloverStrategy max="${logFileCount}" />
</appender>
</Route>
<Route ref="applicationAppender" key="$${ctx:contextId}">
</Route>
</Routes>
</Routing>
</appenders>
<loggers>
<root level="info">
<appender-ref ref="contextSpecificAppender"/>
</root>
</loggers>
Và trong ứng dụng của bạn, bạn chỉ có thể thiết lập các ThreadContext bằng cách gọi ThreadContext.put ("contextId", "cái gì đó") và xóa nó khi bạn đang thực hiện bằng cách gọi ThreadContext.clear() HOẶC ThreadContext.remove ("contextId")
Cuối cùng, tôi đã sử dụng các yếu tố
<RollingFile>
(như các ví dụ liên kết ở trên) thay vì
<appender type="RollingFile">
yếu tố bạn đã sử dụng. Tôi tin rằng điều này được ưa thích khi bạn di chuyển đến log4j2 từ log4j.
Tôi đã tìm thấy giải pháp để bạn không phải sử dụng bộ lọc trong giao lộ với việc chuyển đổi khóa ThreadContext từ được điền thành trống) bằng cách sử dụng hai tuyến. Giống như ví dụ này giải thích http://logging.apache.org/log4j/2.x/faq.html#separate_log_files Bạn có thể sử dụng thuộc tính khóa trên tuyến đường để tạo tuyến đường được chọn nếu ThreadContext không có giá trị cho Chìa khóa. Sau đó tôi sử dụng tuyến đường này để tham khảo người phụ trách chính của tôi. Nếu bạn thiết lập "tuyến đường" thứ hai này, bạn không phải sử dụng ThreadContextMapFilter. Hơn nữa, bạn sẽ chỉ cần một appender-ref trong logger gốc của bạn. – Alex