我正在使用Apache flume进行日志收集。这是我的配置文件
httpagent.sources = http-source
httpagent.sinks = local-file-sink
httpagent.channels = ch3
#Define source properties
httpagent.sources.http-source.type = org.apache.flume.source.http.HTTPSource
httpagent.sources.http-source.channels = ch3
httpagent.sources.http-source.port = 8082
# Local File Sink
httpagent.sinks.local-file-sink.type = file_roll
httpagent.sinks.local-file-sink.channel = ch3
httpagent.sinks.local-file-sink.sink.directory = /home/avinash/log_dir
httpagent.sinks.local-file-sink.sink.rollInterval = 21600
# Channels
httpagent.channels.ch3.type = memory
httpagent.channels.ch3.capacity = 1000
我的应用程序运行正常。我的问题是在log_dir中,文件默认使用一些随机数(我猜它的时间戳)时间戳。
如何为日志文件提供正确的文件名后缀?
答案 0 :(得分:3)
看一下documentation,似乎没有参数来配置要创建的文件的名称。我已经去了sources寻找一些隐藏的参数,但是没有人参与:)
进入实现的细节,似乎文件的名称由PathManager
类管理:
private PathManager pathController;
...
@Override
public Status process() throws EventDeliveryException {
...
if (outputStream == null) {
File currentFile = pathController.getCurrentFile();
logger.debug("Opening output stream for file {}", currentFile);
try {
outputStream = new BufferedOutputStream(new FileOutputStream(currentFile));
...
}
正如您已经注意到的那样,它基于当前时间戳(显示构造函数和下一个文件获取器):
public PathManager() {
seriesTimestamp = System.currentTimeMillis();
fileIndex = new AtomicInteger();
}
public File nextFile() {
currentFile = new File(baseDirectory, seriesTimestamp + "-" + fileIndex.incrementAndGet());
return currentFile;
}
因此,我认为您唯一的可能性是扩展文件卷接收器并覆盖process()
方法以使用自定义路径控制器。
答案 1 :(得分:-1)
对于源代码,您可以根据shell脚本执行命令以拖尾和预挂或附加详细信息。以下是一个示例:
# Describe/configure the source for tailing file
httpagent.sources.source.type = exec
httpagent.sources.source.shell = /bin/bash -c
httpagent.sources.source.command = tail -F /path/logs/*_details.log
httpagent.sources.source.restart = true
httpagent.sources.source.restartThrottle = 1000
httpagent.sources.source.logStdErr = true