【问题标题】:syslog-ng - Passing FILENAME from client to server when using wildcard_filesyslog-ng - 使用 wildcard_file 时将 FILENAME 从客户端传递到服务器
【发布时间】:2020-08-03 20:08:28
【问题描述】:

我正在使用 syslog-ng,远程记录同一镜像的多个容器的应用程序日志。我使用的源配置如下。

source s_wild { wildcard-file(
    base-dir("/var/myapp/logs")
    filename-pattern("*")
    recursive(no)
    flags(no-parse)
    follow-freq(1)
); };

当我在本地机器中使用日志记录(用于测试目的)时,使用 MACRO,${FILE_NAME},它可以工作。但是在使用远程服务器进行测试时,文件名没有通过网络传递。

Aug  3 19:39:46 46fc878e92cf syslog-ng[2320]: Error opening file for writing; filename='', error='Is a directory (21)'

大约有 20-25 个文件,我正在寻找客户端和服务器端文件名的自动映射。可能吗。不确定 wildcard_file 如何映射到远程服务器。从逻辑上讲,这可能是不可能的。还在想办法解决。

我想知道是否可以通过定义多个源和目标或使用 log_prefix 来避免手动 1-1 映射。

【问题讨论】:

    标签: error-logging syslog-ng


    【解决方案1】:

    $FILE_NAME 宏仅在 syslog-ng 接收来自文件或通配符文件源的消息并且不适用于 network() 时才有效。您可以在这里通过网络传递文件名的几个选项是:

    1. 使用RFC 5424 syslog 消息的结构化数据部分
    2. 使用template()json-parser() 从客户端发送消息并在服务器端解析它们
    3. 使用支持结构化消息传递的ewmm()(企业级消息模型)

    在第一种方法中,发送 RFC5424 格式 (IETF-syslog) 消息允许您在 SDATA 字段中设置 FILE_NAME。在源端和目标端使用syslog() 而不是network() 使用IETF syslog 协议发送消息。源文件通配符可以定义为this。整个配置如下:

    syslog-ng 客户端
    source s_wild {
            wildcard-file(
                    base-dir("/var/log_syslog")
                    filename-pattern("*")
                    recursive(no)
                    follow-freq(1)
                    );
    
    };
    
    rewrite r_set_filename{
        set(
            "$FILE_NAME",
             value(".SDATA.file@18372.4.name")
            );
    };
    
    rewrite r_use_basename {
      subst(
            "/var/log_syslog/",
            "",
            value(".SDATA.file@18372.4.name")
            type("string")
            flags("prefix")
           );
    };
    
    destination d_container_logs {
            syslog(
                  "192.168.10.48"
                   transport("tcp")
                   port(5141)
            );
    };
    
    log {source(s_wild); rewrite(r_set_filename); rewrite(r_use_basename); destination(d_container_logs);};
    

    r_set_filename 获取文件的绝对路径,我们砍掉路径位并仅保留使用 r_use_basename 的文件名

    syslog-ng 服务器端
    source s_network {
            syslog(
            transport("tcp")
            port(5141)
            keep_hostname(yes)
            );
    };
    
    
    destination d_container_logs {
        file(
            "/var/sys_log/${.SDATA.file@18372.4.name}"
            create_dirs(yes)
            );
    };
    
    log {source(s_network); destination(d_container_logs);};
    

    【讨论】:

    • 它工作得很好。谢谢@tuxway。不知道您可以在 RFC 5424 中使用 syslog 本身而不是网络。
    猜你喜欢
    • 2023-03-21
    • 2019-08-02
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多