我刚刚开始流利,但我希望能够设置单个输出匹配规则,如下所示:
<match myapp.**>
type file
path logs/
time_slice_format %Y%m%dT%H
time_slice_wait 5m
time_format %Y%m%dT%H%M%S%z
</match>
Run Code Online (Sandbox Code Playgroud)
这很好用,但我想找到一种方法来进一步将标签的名称添加到输出文件名中; 这可能吗?例如,如果我登录,myapp.debug我希望它写入logs/myapp.debug20140918T12_0.log,如果我登录myapp.info它将写入logs/myapp.info20140918T12_0.log等
有没有办法将标签添加到文件名中?
这是我的td-agent.conf文件
<source>
@type http
port 8888
</source>
<match whatever.access>
@type file
path /var/log/what.txt
</match>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用启动服务器时
sudo /etc/init.d/td-agent start
Run Code Online (Sandbox Code Playgroud)
它给出以下错误:
'2016-02-01 10:45:49 +0530 [错误]:fluent / supervisor.rb:359:> main_process中的救援:配置错误文件=“ / etc / td-agent / td-agent.conf” error = “ out_file:>
/var/log/what.txt.20160201_0.log不可写”
有人可以解释什么地方吗?
我在docker容器中运行了本地服务器,该容器设置为使用fluentd作为日志驱动程序。我有docker compose文件,该文件在自己的容器中运行fluentd,nginx,elasticsearch和kibana。因此,fluentd从我的服务器中获取日志,并将其传递给elasticsearch并显示在Kibana上。
我的问题是,如何解析流利的日志(elasticsearch或kibana,如果不能流利的话)以创建新标签,以便我可以对它们进行排序并简化导航。
这是在Kibana中显示的当前日志。现在,我希望将此日志字符串“分解”为新标签。在这种情况下:
2017/01/04 13:26:56.574909 UTC (Example deployment.web) [INFO] [GET] /api/device/ 200 10.562379ms
Run Code Online (Sandbox Code Playgroud)
至
date: 2017/01/04
time: 13:26:56.574909 UTC
message: (Example deployment.web)
logType: [INFO]
other: [GET] /api/device/ 200 10.562379ms
Run Code Online (Sandbox Code Playgroud)
我的docker-compose.yml
version: "2"
services:
fluentd:
image: fluent/fluentd:latest
ports:
- "24224:24224"
volumes:
- ./fluentd/etc:/fluentd/etc
command: /fluentd/etc/start.sh
networks:
- lognet
elasticsearch:
image: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
volumes:
- /usr/share/elasticsearch/data:/usr/share/elasticsearch/data
networks:
- lognet
kibana:
image: kibana
restart: always
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_URL=http://localhost:9200
networks:
- lognet
nginx:
image: nginx
ports: …Run Code Online (Sandbox Code Playgroud) 如果启用RBAC ,Kluentnetes Logging with Fluentd中的流畅守护进程清单将导致授权错误.
$ kubectl logs fluentd-4nzv7 -n kube-system
2018-01-06 11:28:10 +0000 [info]: reading config file path="/fluentd/etc/fluent.conf"
2018-01-06 11:28:10 +0000 [info]: starting fluentd-0.12.33
2018-01-06 11:28:10 +0000 [info]: gem 'fluent-plugin-elasticsearch' version '1.10.0'
2018-01-06 11:28:10 +0000 [info]: gem 'fluent-plugin-kubernetes_metadata_filter' version '0.29.0'
2018-01-06 11:28:10 +0000 [info]: gem 'fluent-plugin-record-reformer' version '0.9.1'
2018-01-06 11:28:10 +0000 [info]: gem 'fluent-plugin-secure-forward' version '0.4.5'
2018-01-06 11:28:10 +0000 [info]: gem 'fluentd' version '0.12.33'
2018-01-06 11:28:10 +0000 [info]: adding match pattern="fluent.**" type="null"
2018-01-06 11:28:10 …Run Code Online (Sandbox Code Playgroud) 我在 GKE 上的 k8s 集群fluentd默认有一个pod 设置(当前命名为fluentd-gcp-v3.1.0-....),但所有日志都以非结构化的形式出现在单个textPayload字段中。让我的 nginx(和所有其他)日志以某种jsonPayload格式出现会更好。
该结构化记录的文档有很多信息,如果你将要自己手动安装代理,但似乎没有要上哪里GKE得到启用日志结构化信息的任何fluend默认安装在幕后。
脱壳到其中的一个fluentd容器我看到下面的文件,这些文件不是默认CONFIGS(nginx/ syslog/ apache)上面列出的结构化测井文档。
/etc/google-fluentd/config.d
containers.input.conf
monitoring.conf
output.conf
system.input.conf
Run Code Online (Sandbox Code Playgroud)
所以基本上,我在 GKE/Stackdriver 上有非结构化的 nginx 日志。如何将它们转换为结构化?
要记录流利的java API,我们首先需要创建一个hashmap,然后将其转换为map,然后将地图传递给日志函数,如:
Map<String, String> data = new HashMap<String, String>();
data.put("from", "userA");
data.put("to", "userB");
LOG.log("follow", data);
Run Code Online (Sandbox Code Playgroud)
在clojure中,我创建了一个hashmap并将其传递给log函数(但是我无法将hashmap转换为map,也许clojure会自动为我执行此操作),但它失败如下.
流利的日志是
2015-05-02 20:52:18 +0800 [warn]: unexpected error error="Could not parse data entirely (0 != 49)"
2015-05-02 20:52:18 +0800 [warn]: suppressed same stacktrace
Run Code Online (Sandbox Code Playgroud)
clojure错误是
clojurewerkz.testcom.core=> (def log (org.fluentd.logger.FluentLogger/getLogger "app" "s1" 8888))
#'clojurewerkz.testcom.core/log
clojurewerkz.testcom.core=> (def x (java.util.HashMap. {"a" "testa"}))
#'clojurewerkz.testcom.core/x
clojurewerkz.testcom.core=> (.log log "test" x)
true
clojurewerkz.testcom.core=> (.log log "test" x)
416694 [nREPL-worker-3] ERROR org.fluentd.logger.sender.RawSocketSender - org.fluentd.logger.sender.RawSocketSender
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at …Run Code Online (Sandbox Code Playgroud) 我已经设置了 Fluentd 记录器,并且可以使用 Fluentdtail input插件来监视文件。所有数据由 fluidd 接收,随后发布到elasticsearch集群。以下是 fluidd 的配置文件:
<source>
@type tail
path /home/user/Documents/log_data.json
format json
tag myfile
</source>
<match *myfile*>
@type elasticsearch
hosts 192.168.48.118:9200
user <username>
password <password>
index_name fluentd
type_name fluentd
</match>
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在log_data.json使用tail. 我在同一目录中也有一个文件log_user.json,我也想监视它并将其日志发布到elasticsearch. 为此,我想用不同的标签创建另一个<source>& <match>,但它开始显示错误。
如何监视多个文件并将fluentd它们发布到elasticsearch. 我看到当我们启动时fluentd它的工作人员就启动了。是否可以启动多个工作程序,以便每个工作程序都监视不同的文件,或者使用任何其他方式来执行此操作。谁能给我指出一些好的链接/教程。
谢谢。
希望在这里得到一些帮助。我的 Fluentd 设置配置为将日志发送到 2 个输出,每个输出都需要不同的日志结构。
目前为止的配置是扫描日志两次,每次添加不同的标签,并根据标签配置相关的解析和输出。
例如:
myapp.log -> tag app_splunk -> filters of type x, y, x -> match and output to splunk
myapp.log -> tag app_s3 -> different set of filters -> output to S3
我正在尝试找到一种正确的方法来处理日志一次并获得相同的结果而无需双重标记。我尝试使用 @relabel 并根据标签提供一组新的过滤器,结果是日志已经由第一个过滤器集合处理,现在新的过滤器无法正常工作。
知道我怎样才能实现这一目标吗?
我正在使用 fluidd-cloudwatch 将日志从 Kubernetes 转发到 cloudwatch。所有日志都转发到同一个日志组,但每个容器都有自己的日志流。我有一些过滤指标和基于这些指标的警报。例如,一个过滤器度量可以是“xxx 连接错误”。每次日志中出现错误时,我都会收到通知。这就是全部工作。但问题是我无法判断错误来自哪个日志流,因为我想知道哪个容器生成了该错误。