Tệp cấu hình XML log4j2 rất đơn giản bằng cách sử dụng Bảng điều khiển và Trình nối thêm tệp


223

Tôi muốn một tệp cấu hình XML rất đơn giản với bảng điều khiển và trình nối thêm tệp bằng log4j2.

(Trang web Apache đang giết tôi với nhiều thông tin.)


72
Haha - rất vui vì bạn đã nói điều này "(Trang web Apache đang giết tôi với nhiều thông tin.)"
nối

19
Câu đó của bạn (Trang web Apache đang giết tôi với nhiều thông tin.) Là lý do chính tại sao tôi đang xem câu hỏi của bạn!
Ju Oliveira

Câu trả lời:


281
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

Ghi chú:

  • Đặt nội dung sau vào tập tin cấu hình của bạn.
  • Đặt tên tệp cấu hình log4j2.xml
  • Đặt log4j2.xml vào một thư mục nằm trong đường dẫn lớp (tức là thư mục nguồn của bạn "src")
  • Sử dụng Logger logger = LogManager.getLogger();để khởi tạo logger của bạn
  • Tôi đã đặt ngay lập tức = "false" vì điều này tốt hơn cho tuổi thọ SSD . Nếu bạn cần nhật ký ngay trong tệp nhật ký của mình, hãy xóa tham số hoặc đặt thành đúng

1
Để hoàn thiện, sử dụng ngay lập tức sử dụng ngay lập tức = "false" khi sử dụng Async Loggers hoặc AsyncAppender.
Remko Popma

1
Bối cảnh: InstantFlush = "false" cho phép các thành phần không đồng bộ của Log4J2 kết hợp nhiều sự kiện nhật ký trong một lần ghi đĩa. Là một phần thưởng, các sự kiện nhật ký gần đây nhất của bạn luôn được ghi vào đĩa và không bao giờ bị treo trong bộ nhớ đệm. (Một cái gì đó tôi thấy khó chịu về log4j-1.2.)
Remko Popma

1
Tôi không thể lấy các ví dụ trên trang Log4j 2.0 để làm việc nhưng cái này thì có. Cảm ơn bạn.
djangofan

12
Vui lòng thêm một thực tế là có thể cần phải làm sạch đối với những người sử dụng nhật thực. Vì lợi ích của nhân loại.
Reut Sharabani

1
@ThorstenNiehues Tôi không thể chỉnh sửa nhận xét trước đây của mình, nhưng nhật thực sao chép cấu hình khi bạn xây dựng và vì một số lý do, nó không luôn sao chép log4j.xml ngay cả khi nó thay đổi. Ít nhất đó là những gì đã giải quyết nó cho tôi.
Reut Sharabani

19

Dưới đây là cách đơn giản của tôi log4j2.xmllà in ra bàn điều khiển và ghi vào tệp cuộn hàng ngày:

// java
private static final Logger LOGGER = LogManager.getLogger(MyClass.class);


// log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">target/cucumber-logs</Property>
        <Property name="rollingFileName">cucumber</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
        </Console>
        <RollingFile name="rollingFile" fileName="${logPath}/${rollingFileName}.log" filePattern="${logPath}/${rollingFileName}_%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%highlight{%-5level}] %d{DEFAULT} %c{1}.%M() - %msg%n%throwable{short.lineNumber}" />
            <Policies>
                <!-- Causes a rollover if the log file is older than the current JVM's start time -->
                <OnStartupTriggeringPolicy />
                <!-- Causes a rollover once the date/time pattern no longer applies to the active file -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="rollingFile" />
        </Root>
    </Loggers>
</Configuration>

TimeBasingTriggeringPolicy

khoảng (số nguyên) - Tần suất tái xuất hiện thường xuyên dựa trên đơn vị thời gian cụ thể nhất trong mẫu ngày. Ví dụ: với mẫu ngày có giờ là mặt hàng cụ thể nhất và việc tăng 4 vòng quay sẽ xảy ra cứ sau 4 giờ. Giá trị mặc định là 1.

điều chế (boolean) - Cho biết liệu khoảng thời gian có nên được điều chỉnh để khiến cuộn qua tiếp theo xảy ra trên ranh giới khoảng hay không. Ví dụ: nếu mục là giờ, giờ hiện tại là 3 giờ sáng và khoảng thời gian là 4 thì lần tái đầu tiên sẽ xảy ra vào lúc 4 giờ sáng và sau đó lần tiếp theo sẽ xảy ra vào lúc 8 giờ sáng, trưa, 4 giờ chiều, v.v.

Nguồn: https://logging.apache.org/log4j/2.x/manual/appender.html

Đầu ra:

[INFO ] 2018-07-21 12:03:47,412 ScenarioHook.beforeScenario() - Browser=CHROME32_NOHEAD
[INFO ] 2018-07-21 12:03:48,623 ScenarioHook.beforeScenario() - Screen Resolution (WxH)=1366x768
[DEBUG] 2018-07-21 12:03:52,125 HomePageNavigationSteps.I_Am_At_The_Home_Page() - Base URL=http://simplydo.com/projector/
[DEBUG] 2018-07-21 12:03:52,700 NetIncomeProjectorSteps.I_Enter_My_Start_Balance() - Start Balance=348000

Một tệp nhật ký mới sẽ được tạo hàng ngày với ngày trước đó tự động được đổi tên thành:

cucumber_yyyy-MM-dd.log

Trong một dự án Maven, bạn sẽ đặt các log4j2.xmltrong src/main/resources hoặc src/test/resources .


12

log4j2 có một hệ thống cấu hình rất linh hoạt (mà IMHO gây mất tập trung hơn là trợ giúp), thậm chí bạn có thể sử dụng JSON. Xem https://logging.apache.org/log4j/2.x/manual/configuration.html để tham khảo.

Cá nhân, gần đây tôi mới bắt đầu sử dụng log4j2, nhưng tôi đang có xu hướng cấu hình "XML nghiêm ngặt" (nghĩa là sử dụng các thuộc tính thay vì tên thành phần), có thể được xác thực bằng lược đồ.

Dưới đây là ví dụ đơn giản của tôi bằng cách sử dụng cấu hình tự động và chế độ nghiêm ngặt, sử dụng "Thuộc tính" để đặt tên tệp:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
    <Properties>
        <Property name="filename">log/CelsiusConverter.log</Property>
    </Properties>
    <Appenders>
        <Appender type="Console" name="Console">
            <Layout type="PatternLayout" pattern="%d %p [%t] %m%n" />
        </Appender>
        <Appender type="Console" name="FLOW">
            <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n" />
        </Appender>
        <Appender type="File" name="File" fileName="${filename}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File" />
            <AppenderRef ref="Console" />
            <!-- Use FLOW to trace down exact method sending the msg -->
            <!-- <AppenderRef ref="FLOW" /> -->
        </Root>
    </Loggers>
</Configuration>

Cấu hình linh hoạt có ích khi bạn cố tách cấu hình khỏi bản dựng và đặt cấu hình vào kho lưu trữ ở nơi khác. Thật không may, sự phức tạp đang làm cho nó một chút khó chịu, nhưng chỉ nghĩ rằng tôi sẽ đưa ra một lợi ích cho các tùy chọn linh hoạt cho cấu hình.
adprocas

Là gì Filechính sách ở đây? Kích thước tập tin tối đa là gì? Và làm thế nào để nó ghi vào tập tin? (tệp có luôn chứa 10mb nhật ký cuối cùng không?)
Tina J
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.