我正在尝试使用代码中的记录器从 Django 项目设置 Fluentd 日志处理程序:
def get_fluentd_logger(name):
import logging
from fluent import handler
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(name)
logger.addHandler(handler.FluentHandler(name, host='localhost', port=24224))
return logger
Run Code Online (Sandbox Code Playgroud)
handler.FluentHandler来自包fluent-logger,我在本地运行fluent。
流利的.conf:
<source>
type forward
port 24224
</source>
<match **>
type copy
<store>
type stdout
</store>
<store>
type forward
send_timeout 60s
recover_wait 10s
heartbeat_interval 1s
phi_threshold 8
hard_timeout 60s
<server>
name monitoring
host 1.2.3.4
port 24224
weight 100
</server>
</store>
</match>
Run Code Online (Sandbox Code Playgroud)
当我从非 django python 项目运行它时,它工作正常,但是当从 django 调用时,它不执行任何操作。
问题是:有没有办法查看当前安装的记录器及其处理程序,以便我可以调试这种情况?
[编辑]
当从 django 设置完成时,如下所示:
LOGGING …Run Code Online (Sandbox Code Playgroud) 我有这种格式的日志:
2015-02-25 18:33:06,975 INFO c.a.p.c.b.s.Monitor akka://application/user/daemons/monitor : 91 active threads, 4175691776 bytes used
Run Code Online (Sandbox Code Playgroud)
我想到了这个正则表达式:
(?<time>[^ ]* [^ ]*) (?<method>[^ ]*) (?<path>[^ ]*) (?<message>[^ ].*$)
Run Code Online (Sandbox Code Playgroud)
当我在Fluentular 中测试时 (我将使用它作为 fluentd 日志输入的格式)我得到以下字段:
time => 2015/02/25 18:33:06 +0000
method => INFO
PATH => <empty>
message => c.a.p.c.b.s.Monitor akka://application/user/daemons/monitor : 91 active threads, 4175691776 bytes used
Run Code Online (Sandbox Code Playgroud)
我无法打破消息字符串。我希望匹配的组是:
time => 2015/02/25 18:33:06 +0000
method => INFO
PATH => c.a.p.c.b.s.Monitor
message => akka://application/user/daemons/monitor : 91 active threads, 4175691776 bytes used
Run Code Online (Sandbox Code Playgroud)
什么是合适的正则表达式
我正在寻找一种使用 fluentd 测量事件之间经过时间的方法。能够合并两个或多个事件也很棒。
到目前为止,我一直在使用logstash。我在 logstash 中的用例有两个插件:
我只是不知道如何在 fluentd 中做到这一点。我在这里错过了什么?
例子:
我有一个包含进程日志的文本文件,如下所示:
Fri May 8 05:00:00 GMT 2015: start subprocess 1 with param p
Fri May 8 05:10:42 GMT 2015: some other message
Fri May 8 05:11:44 GMT 2015: doing more stuff
Fri May 8 05:10:00 GMT 2015: end subprocess 1
Run Code Online (Sandbox Code Playgroud)
我的目标是根据事件的时间戳来衡量完成子流程 1 所花费的时间。这可以使用 logstash 中的 elapsed 过滤器轻松完成,但我不知道如何在 fluentd 中解决这个问题。
我想要一个 :
2015-05-08 05:10:00 parsed: {"message":"end subprocess 1","elapsed.time":"10.0"}
Run Code Online (Sandbox Code Playgroud)
.. 甚至更好我想合并事件的一些字段(例如来自开始事件的参数):
2015-05-08 05:10:00 parsed: {"message":"end subprocess 1","elapsed.time":"10.0", "param": …Run Code Online (Sandbox Code Playgroud) 我在 docker 中有以下设置:
应用程序的 logdriver 的配置描述了 fluentd 容器。日志将保存在 ES 中并显示在 Kibana 中。
当 logdriver 配置为这样时,它可以工作:
web:
image: httpd
container_name: httpd
ports:
- "80:80"
links:
- fluentd
logging:
driver: "fluentd"
options:
fluentd-address: localhost:24224
tag: httpd.access
Run Code Online (Sandbox Code Playgroud)
fluentd 将其暴露的端口 24224 映射到主机的端口 24224 上。
fluentd:
build: ./fluentd
image: fluentd
container_name: fluentd
links:
- "elasticsearch"
ports:
- "24224:24224"
Run Code Online (Sandbox Code Playgroud)
但我不想在主机网络上暴露我的流利。我想让它在 docker 网络中保持“私有”(我只想在主机网络上映射应用程序和 kibana),如下所示:
fluentd:
build: ./fluentd
image: fluentd
container_name: fluentd
links:
- "elasticsearch"
Run Code Online (Sandbox Code Playgroud)
端口 24224 仍然公开(在 dockerfile 中),但它没有映射到主机网络上。现在我想更改我的应用程序的日志驱动程序的配置: logging: driver: "fluentd" …
我当前使用的设置是具有多个容器的 Docker 组合堆栈。这些容器将其日志记录信息发送到运行 Fluentd 守护进程的日志记录容器(在 compose 堆栈内)。Fluentd 的配置由一个in_forward源组成,该源收集日志并将其写入单独的文件,具体取决于容器。我的 Fluentd 配置文件类似于:
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match container1>
@type copy
<store>
@type file
path /fluentd/log/container1.*.log
format single_value
message_key "log"
</store>
</match>
...
Run Code Online (Sandbox Code Playgroud)
我的 docker-compose.yml 文件看起来像这样:
version: '3'
services:
container1:
build: ./container1
container_name: "container1"
depends_on:
- "logger"
logging:
driver: "fluentd"
options:
tag: container1
networks:
static-net:
ipv4_address: 172.28.0.4
...
logger:
build: ./logger
container_name: "logger"
ports:
- "24224:24224"
- "24224:24224/udp"
volumes:
- ./logger/logs:/fluentd/log
networks:
static-net:
ipv4_address: 172.28.0.5
networks:
static-net: …Run Code Online (Sandbox Code Playgroud) 使用 json 从 fluidd 输出插件 stdout 中删除时间和标签
Fluentd 的输出插件产生如下输出:
2017-11-28 11:43:13.814351757 +0900 标签: {"field1":"value1","field2":"value2"}
所以时间戳和标签位于 json 之前。如何删除这些字段 - 我只喜欢 json 输出
<match pattern>
@type stdout
</match>
Run Code Online (Sandbox Code Playgroud)
预期输出:{“field1”:“value1”,“field2”:“value2”}
运行 Fluentd 3.5,在刷新缓冲区失败后似乎放弃了。我可以看到有一个 retry_forever 参数当前设置为 false,但是我宁愿找出导致它的原因并将重试阈值设置为更高的值
配置:
<source>
@type tail
path "XXX"
tag "XXX"
pos_file "XXX"
<parse>
@type "json"
</parse>
</source>
<match *.**>
@type forward
compress gzip
buffer_type file
buffer_path d:\dynamo\td-agent\buffer
flush_interval 10m
<server>
host "XXX"
port XXX
</server>
<buffer tag>
@type file
path XXX
flush_interval 10m
</buffer>
</match>
Run Code Online (Sandbox Code Playgroud)
日志
2019-09-30 13:53:03 +0100 [warn]: #0 failed to flush the buffer. retry_time=0 next_retry_seconds=2019-09-30 13:53:04 +0100 chunk="593c4937d535515d77cffca381c87720" error_class=Fluent::Plugin::ForwardOutput::NoNodesAvailable error="no nodes are available"
2019-09-30 13:53:03 +0100 [warn]: #0 d:/Dynamo/td-agent/embedded/lib/ruby/gems/2.4.0/gems/fluentd-1.7.0/lib/fluent/plugin/out_forward/load_balancer.rb:55:in `select_healthy_node'
2019-09-30 13:53:03 +0100 …Run Code Online (Sandbox Code Playgroud) 我的目标是从 Bare Kubernetes 上运行的 Java (Spring Boot) 应用程序收集日志。然后这些日志会被翻译成 ES 并在 Kibana 中可视化。
为此,我通过 Kubernetes 1.22 部署了 Fleunt Bit 1.8.9。由于我使用 Containerd 代替 Docker,所以我的 Fluent Bit 配置如下(请注意,我只指定了一个日志文件):
fluent-bit.conf: |
[SERVICE]
Flush 1
Log_Level info
Daemon off
Parsers_File parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
@INCLUDE input-kubernetes.conf
@INCLUDE filter-kubernetes.conf
@INCLUDE output-elasticsearch.conf
input-kubernetes.conf: |
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Read_from_head true
Parser cri
filter-kubernetes.conf: |
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
Kube_Tag_Prefix kube.var.log.containers.
Merge_Log On
Merge_Log_Key log_processed …Run Code Online (Sandbox Code Playgroud) 我想将一些 nginx 日志从 Fluentd 发送到 Elasticsearch ,但是,由于以下错误消息,Fluentd 无法启动:
客户端无法验证服务器是否为 Elasticsearch。如果服务器运行不受支持的产品,某些功能可能不兼容。
[error]: #0 意外错误 error_class=Elasticsearch::UnsupportedProductError error="客户端注意到服务器不是 Elasticsearch,我们不支持这个未知产品。"
这是我的流利配置:
<source>
@type tail
<parse>
@type nginx
</parse>
path /tmp/lab4/nginx/access.log
pos_file /tmp/lab4/nginx/access.po
tag nginx.access
</source>
<match nginx.**>
@type elasticsearch
scheme http
host 192.168.1.154
port 9200
with_transporter_log true
@log_level debug
</match>
Run Code Online (Sandbox Code Playgroud)
如果我执行curl http://192.168.1.154:9200,我可以看到Elasticsearch 的响应以及系统版本和其他信息。
作为参考,我正在使用:
知道我做错了什么吗?
在这个系统上,我有calyptia-fluentd,并且我正在尝试开发一个自定义过滤器插件。
首先,我使用一些初始代码创建了一个 gem,并且安装了这个 gem,并使用该插件创建了一个配置文件。
但是,calyptia-fluentd从命令行启动(环境是安装程序提供的环境,而不是通用的 Windows 命令提示符)会出现以下情况:
C:\opt\calyptia-fluentd>calyptia-fluentd -vv
2022-08-11 16:24:23 +0200 [info]: fluent/log.rb:330:info: parsing config file is succeeded path="C:\\opt\\calyptia-fluentd\\bin\\\\..\\etc\\calyptia-fluentd\\calyptia-fluentd.conf"
2022-08-11 16:24:23 +0200 [info]: fluent/log.rb:330:info: gem 'fluentd' version '1.15.0'
2022-08-11 16:24:23 +0200 [info]: fluent/log.rb:330:info: gem 'fluent-plugin-calyptia-monitoring' version '0.1.3'
...
2022-08-11 16:24:23 +0200 [info]: fluent/log.rb:330:info: gem 'fluent-plugin-custom' version '0.0.3'
...
2022-08-11 16:24:23 +0200 [info]: fluent/log.rb:330:info: gem 'fluent-plugin-windows-eventlog' version '0.8.1'
2022-08-11 16:24:23 +0200 [error]: fluent/log.rb:372:error: config error file="C:\\opt\\calyptia-fluentd\\bin\\\\..\\etc\\calyptia-fluentd\\calyptia-fluentd.conf" error_class=Fluent::NotFoundPluginError error="Unknown filter plugin 'filter_custom'. Run 'gem search -rd fluent-plugin' …Run Code Online (Sandbox Code Playgroud)