Điểm:0

Set INFO/ERROR priority for messages logged to journal via stdout and stderr?

lá cờ jp

We have many production apps (first and third-party) that leave logging up to the process that runs the app and just log to stdout for INFO and stderr for ERROR logs (ie only 2 log priorities: INFO|ERROR).

With a systemd service unit for an app this can be setup like this:

StandardOutput=journal
StandardError=journal

This allows devops to manage everything through systemd units and the journal in order to facilitate centralized log collection, monitoring whatever...and they don't need to worry about locating and parsing different logs in different formats/locations for every app they deploy.

systemd's journal has a message priority system compatible with syslog's 7 level message priority system. INFO is level 6 and ERROR is level 3. See references for more details.

The problem is... systemd/journal apparently does not distinguish between messages written to the journal from stdout vs stderr. Both stdout and stderr messages are all written to the journal with default priority of 6 (INFO).

Example: "Fancy App"

/opt/log-test.sh

#!/bin/bash

echo "This is ERROR" 1>&2
echo "This is INFO"

exit 0

/etc/systemd/system/log-test.service

[Unit]
Description=log test for journal

[Service]
Type=simple

ExecStart=/opt/log-test.sh

StandardOutput=journal
StandardError=journal
SyslogIdentifier=log-test

run it and check journal

$ systemctl start log-test
$ journalctl -u log-test
-- Logs begin at Thu 2022-04-07 08:17:16 UTC, end at Thu 2022-04-07 16:35:02 UTC. --
Apr 07 16:34:58 host.example.com systemd[1]: Started log test for journal.
Apr 07 16:34:58 host.example.com log-test.sh[29909]: This is ERROR
Apr 07 16:34:58 host.example.com log-test.sh[29909]: This is INFO
$ journalctl -u log-test -p 6   # syslog info priority
-- Logs begin at Thu 2022-04-07 08:17:16 UTC, end at Thu 2022-04-07 16:35:08 UTC. --
Apr 07 16:34:58 host.example.com systemd[1]: Started log test for journal.
Apr 07 16:34:58 host.example.com log-test.sh[29909]: This is ERROR
Apr 07 16:34:58 host.example.com log-test.sh[29909]: This is INFO
$ journalctl -u log-test -p 3   # syslog error priority
-- No entries --
$

You can see that both stderr and stdout messages are set to priority 6 (INFO) when written to the journal.

This is a problem because we don't have an easy way of differentiating output on stdout vs stderr when using stdio->journal as primary logging facility.

This has been discussed before and solutions are possible, but not implemented. I'm hoping the systemd team eventually implements this, but meanwhile I need a solution.

Has anyone found a reasonable solution to get messages written to stdout and stderr to be different priorities in the journal without modifying how an app does logging?

I don't want all the apps we deploy (not all written by us) to have to implement journal or syslog integrations in order to get log priority when we really only need two levels: INFO (stdout) and ERROR (stderr).

Much of what we deploy is not containerized, so relying on logging facilities of the container is also not a solution for us.

Having stderr and stdout go to journal/syslog at different priorities by default is pretty critical for making distributed log error monitoring easier (assuming good developer hygiene about only writing stuff that needs attention to stderr).

References:

Điểm:1
lá cờ tz

Nếu bạn phải sử dụng tiêu chuẩn/tiêu chuẩn, bạn có thể sử dụng sd-daemon tiền tố đăng nhập.

chuẩn bị của bạn tiêu chuẩn với <3> để gửi một LỖI sự ưu tiên nhật ký nhật ký.

sử dụng của bạn log-test.shlog-test.service:

#!/bin/bash

>&2 echo "<3>Đây là LỖI"
echo "Đây là THÔNG TIN"

thoát 0

tạp chí đầu ra:

$ journalctl -u log-test -p 3
Ngày 02 tháng 5 01:22:58 host.example.com log-test.sh[29909]: Đây là LỖI

Nếu là của bạn ưa thích-ứng dụng có bất kỳ API nào để ghi vào nhật ký hệ thống, bạn có thể sử dụng nó để ghi vào UNIX datagram /dev/log (thường có thể ghi theo mặc định và đăng nhập vào nhật ký) thay vì tiêu chuẩn/tiêu chuẩn. Sử dụng thẻ nhật ký hệ thống để xác định ưa thích-ứng dụng, ưu tiên nhật ký hệ thống cho lỗi hoặc thông tin tùy thuộc vào nhu cầu của bạn và bất kỳ cơ sở nhật ký hệ thống nào.

Ví dụ, trong Bash chúng ta có thể sử dụng tiều phu:

# gửi tin nhắn INFO tới tạp chí
$ logger -t Fancy-app -u /dev/log -p user.info "Đây là THÔNG TIN"

# gửi thông báo LỖI tới tạp chí
$ logger -t Fancy-app -u /dev/log -p user.error "Đây là LỖI"

# hiển thị tin nhắn nhật ký cho ứng dụng ưa thích
$ journalctl -t ứng dụng ưa thích
Ngày 02 tháng 5 01:23:38 host.example.com ưa thích ứng dụng [27302]: Đây là THÔNG TIN
Ngày 02 tháng 5 01:23:39 host.example.com ưa thích ứng dụng [27303]: Đây là LỖI

# hiển thị các thông báo LỖI được ghi nhật ký cho ứng dụng ưa thích
$ journalctl -t ưa thích-ứng dụng -p 3
Ngày 02 tháng 5 01:23:39 host.example.com ưa thích ứng dụng [27303]: Đây là LỖI

Lưu ý rằng trong hầu hết các distro nhật ký các mục thường được chuyển tiếp đến trình nền nhật ký hệ thống cục bộ (syslog-ng, rsyslog, ...), vì vậy có thể kiểm tra các bộ lọc nhật ký hệ thống của bạn hoặc có thể sử dụng cục bộ0...địa phương7 cơ sở.

Chúng tôi có nhiều ứng dụng sản xuất (bên thứ nhất và bên thứ ba) không đăng nhập vào vùng chứa và chỉ đăng nhập vào thiết bị xuất chuẩn cho INFO và thiết bị xuất chuẩn cho nhật ký LỖI (tức là chỉ có 2 ưu tiên nhật ký: THÔNG TIN | LỖI).

Hầu hết các công cụ chứa sẽ có thể đăng nhập vào nhật ký hệ thống. Nếu không biết công cụ chứa của bạn, tôi sẽ sử dụng Docker làm ví dụ.

Docker có trình điều khiển ghi nhật ký hệ thống có thể được sử dụng để gửi thông báo nhật ký bằng định dạng nhật ký hệ thống tới bất kỳ mục tiêu nhật ký hệ thống nào. Bạn sẽ có thể đăng nhập vào nhật ký với một cái gì đó như:

docker chạy \
    --log-driver syslog \
    --log-opt syslog-address=unix:///dev/log \
    --log-opt syslog-facility=người dùng \
    --log-opt tag=fancy-app \
    ưa thích-ứng dụng: mới nhất

Docker cũng có trình điều khiển ghi nhật ký có sẵn. Ví dụ:

docker chạy \
    --log-driver journald \
    --log-opt tag=fancy-app \
    ưa thích-ứng dụng: mới nhất

Cả hai trình điều khiển đăng nhập (nhật ký hệ thốngnhật ký) hỗ trợ tách giữa tiêu chuẩntiêu chuẩn; I E. tiêu chuẩn tin nhắn sẽ được ghi lại với THÔNG TIN ưu tiên và tiêu chuẩn tin nhắn sẽ được ghi lại với LỖI sự ưu tiên.

Triết lý và ngọn lửa chiến tranh sang một bên, tại sao không đăng nhập vào nhật ký hệ thống thực? Nó dễ dàng hơn, được lưu trữ ở định dạng văn bản và thường được hỗ trợ bởi các phần mềm quản lý nhật ký (xem Graylog, nhật ký, Dấu vết giấy tờ).

mattpr avatar
lá cờ jp
Cảm ơn câu trả lời của bạn, tôi sẽ tiêu hóa chi tiết sau ngày hôm nay sau khi uống thêm một số loại cà phê. Chúng tôi không sử dụng thùng chứa cho nhiều thứ, vì vậy đó không phải là giải pháp tức thời. Một số phần còn lại có vẻ hữu ích. Chúng tôi thực hiện tổng hợp nhật ký trung tâm với ELK hoặc Graylog (hiện tại là graylog) và có thể sử dụng/vận chuyển cả nhật ký hệ thống và nhật ký (thông qua journalbeat hiện nay là filebeat) vào cụm tổng hợp nhật ký. Vấn đề vẫn là chúng tôi thường không thể kiểm soát mã ứng dụng mà chúng tôi triển khai (ví dụ: ứng dụng của bên thứ ba mà chúng tôi không muốn duy trì bản vá ghi nhật ký) và thường các ứng dụng mặc định là thiết bị xuất chuẩn/thiết bị xuất chuẩn...hoặc tệ hơn là các tệp ghi nhật ký của chính chúng /formats.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.