AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 717076
Accepted
Gabriel Staples
Gabriel Staples
Asked: 2022-09-13 16:57:35 +0800 CST2022-09-13 16:57:35 +0800 CST 2022-09-13 16:57:35 +0800 CST

Buildroot:syslog-ng 登录到“/var/log/messages.1”文件而不是“/var/log/messages”

  • 772

我正在使用 Buildroot 构建嵌入式 Linux 板(此处为用户手册)。

我已经syslog-ng在板上运行了。它的配置文件在此处的 buildroot 中指定:https://github.com/buildroot/buildroot/blob/master/package/syslog-ng/syslog-ng.conf:

@version: 3.37

source s_sys {
    file("/proc/kmsg" program_override("kernel"));
    unix-stream ("/dev/log");
    internal();
};

destination d_all {
    file("/var/log/messages");
};

log {
    source(s_sys);
    destination(d_all);
};

请注意,它将目标指定为"/var/log/messages",但板上的活动日志记录正在进入一个名为 的文件/var/log/messages.1,并且该/var/log/messages文件甚至不存在。这是为什么?有没有办法/var/log/messages代替登录到文件?

我们过去使用的 Syslog 登录到/var/log/messages,我们正试图保持这种行为以保持一致性。

补充说明

  1. ls -1 /var/log在运行的板上syslog包含以下messages文件:
    messages
    messages.1
    messages.2
    messages.2.gz
    messages.3
    messages.4
    messages.5
    messages.6
    messages.7
    
  2. ls -1 /var/log在运行的板上syslog-ng包含这些messages文件(缺少通知messages):
    messages.1
    messages.2
    messages.3
    messages.4
    messages.5
    messages.6
    messages.7
    
  3. 在syslog-ng板上,tail -f /var/log/messages.1显示它不断接收记录的消息,这是出乎意料的,因为当使用syslog“活动”文件时/var/log/messages。
linux embedded
  • 1 1 个回答
  • 47 Views

1 个回答

  • Voted
  1. Best Answer
    Gabriel Staples
    2022-09-13T21:52:51+08:002022-09-13T21:52:51+08:00

    解决了!您必须在每次日志轮换后强制syslog-ng重新打开其目标日志文件

    所以,我想通了。感谢@Murray Jensen在这里的提示。

    每当logrotate旋转我的/var/log/messages文件时,它都会将其重命名为/var/log/messages.1. 但是,syslog-ng正在写入它打开的原始文件描述符 (fd) 指向的文件。将文件从/var/log/messagesto重命名/var/log/messages.1不会更改文件描述符,因此文件描述符 syslog-ng 现在正在写入指向现在名为. 修复方法是简单地强制重新打开其日志文件并在每次日志轮换后获取新的文件描述符,从而使其为新创建的目标日志文件获取新的文件描述符,该文件现在存在于./var/log/messages.1syslog-ng/var/log/messages

    有 3 种方法可以做到这一点,我在这里写过:https ://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-1270517815

    请参阅此处了解我了解的地方syslog-ng-ctl reopen,这是推荐的方式:https ://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-346624252

    3种方式是:

    # Option 0 (no longer recommended): call the heavier `reload` command after log
    # rotation
    syslog-ng-ctl reload
    
    # Option 1 (RECOMMENDED): call the new `reopen` command after log rotation
    syslog-ng-ctl reopen
    
    # Option 2 (same thing as Option 1 above): send the `SIGUSR1` kill signal to the
    # running `syslog-ng` process
    pid="$(cat /var/run/syslog-ng.pid)" kill -SIGUSR1 $pid
    

    因此,要强制logrotate在每次日志轮换后自动调用上述 3 种方式之一,您必须将正确的命令作为postrotate脚本添加到您的/etc/logrotate.d/syslog-ng(或类似的——可以命名为任何内容)logrotate配置文件中。下面是一个固定的 logrotate 配置文件现在的样子:

    从我这里的笔记:

    示例/etc/logrotate.d/syslog-ng logrotate配置文件:

    /var/log/auth.log 
    /var/log/user.log
    /var/log/messages  
    {
        rotate 7
        size 20M
        delaycompress
        missingok
        # Required for syslog-ng after each rotation, to cause it to reopen log
        # files so it can begin logging to the new log file under a new file
        # descriptor, rather than to the old log file which has now been rotated
        # and renamed. 
        postrotate
            # After rotating the log files, cause syslog-ng to reopen the
            # destination log files so it will log into the newly-created log files
            # rather than into the now-rotated and renamed ones.
            #
            # This ensures, for example, that syslog-ng will move its file
            # descriptor to begin logging into the main "/var/log/messages" log
            # file again, instead of into the now-rotated "/var/log/messages.1"
            # file, which the old file descriptor (fd) is now pointing to since
            # that fd's filename was just renamed from "/var/log/messages"
            # to "/var/log/messages.1" during the log rotation.
    
            # Option 1:
            syslog-ng-ctl reopen
            # OR, Option 2
            # pid="$(cat /var/run/syslog-ng.pid)" kill -SIGUSR1 $pid
        endscript
    }
    

    注意:我还在这里打开了文档更改请求:https ://github.com/syslog-ng/syslog-ng/issues/4166 。现在建议syslog-ng-ctl reopen在每次日志轮换后使用,而不是syslog-ng-ctl reload.

    旧尝试的答案(我首先尝试的)

    在运行的板上syslog-ng,我完全刷新了 rootfs(根文件系统)映像,然后重新启动了板,现在我/var/log/messages再次看到该文件:

    的部分输出ls -1 /var/log:

    messages
    messages.1
    messages.2
    messages.3
    messages.4
    messages.5
    messages.6
    messages.7
    

    我无法解释。tail -f /var/log/messages确实如预期的那样显示进入该文件的活动日志,并tail -f /var/log/messages.1显示该文件是静态的,没有新消息进入,也如预期的那样。

    syslog-ng我可以通过查看以下输出来证明该板确实在运行ps aux | grep syslog:

    # ps aux | grep syslog
      803 root      0:00 {syslog-ng} supervising syslog-ng
      804 root      0:02 /usr/sbin/syslog-ng
    12571 root      0:00 grep syslog
    

    syslog...与在板上运行时相同的命令的输出相反:

    # ps aux | grep syslog
      789 root      0:19 /sbin/syslogd -n -n -s 0
     2993 root      0:00 grep syslog
    

    同样,我不确定发生了什么,也不知道为什么。

    在两个板上,都ps aux | grep logrotate显示logrotate正在运行。前任:

    # ps aux | grep logrotate
     1299 root      0:00 runsv logrotate-periodically
    14208 root      0:00 grep logrotate
    

    两块板子有相同的/etc/logrotate.conf文件,只有syslog-ng板子有/etc/syslog-ng.conf文件,里面有问题里的内容。

    如果我在接下来的几天里发现任何新的东西,我会回来更新这个答案。

    • 0

相关问题

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

  • 以 root 用户身份访问文件系统

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve