使用jar包格式化Docker 容器日志

前面使用JS格式化textarea中的日志内容,但局限于JS语言性能,在日志内容较多时效率无法接受,建议日志内容大于5000行时转投本java程序,文末提供jar包下载。

LogsFormat.java

package com.geostar.gfstack.docker.util;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.apache.commons.io.IOUtils;

import java.io.*;

/**
 * @author 王睿
 * @date 2019-01-17 10:54
 */
public class LogsFormat {

    public static void main(String[] args) throws IOException {
        if (args.length == 0) {
            System.err.println("请输入第一个参数:日志文件路径");
            return;
        }
        String fileName = args[0];
        InputStream is = LogsFormat.class.getResourceAsStream("/templates/DockerLogsTemplate.html");
        String html = IOUtils.toString(is, "UTF-8");
        File file = new File(fileName);
        String text = IOUtils.toString(new FileInputStream(file), "UTF-8");
        String[] arr = text.split("\n");
        JsonParser parser = new JsonParser();
        String time, log, stream;
        StringBuilder sb = new StringBuilder(1024 * 10);
        for (int i = 0; i < arr.length; i++) {
            try {
                JsonObject jsonObject = parser.parse(arr[i]).getAsJsonObject();
                time = jsonObject.get("time").getAsString();
                log = jsonObject.get("log").getAsString();
                stream = jsonObject.get("stream").getAsString();
                sb.append("<tr");
                if ("stderr".equals(stream)) {
                    sb.append(" class=‘stderr‘");
                }
                sb.append("><td>");
                sb.append(i + 1);
                sb.append("</td><td>");
                sb.append(time);
                sb.append("</td><td>");
                sb.append(log);
                sb.append("</td></tr>");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        html = html.replace("<![data]>", sb.toString());
        File outFile = new File(file.getPath() + ".html");
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8");
        out.write(html);
        out.close();
        System.out.println("Docker日志格式化成功,请查看:" + outFile.getAbsoluteFile());
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>geostack</groupId>
    <artifactId>docker-logs-format</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.1</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.geostar.gfstack.docker.util.LogsFormat</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerVersion>1.8</compilerVersion>
                    <skip>true</skip>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

执行 mvn clean compile assembly:single 构建可执行jar包即可使用,执行jar包时Docker原始日志文件作为第一个参数,在同目录下即可生成同名html文件,使用浏览器打开查看即可。

jar包下载地址:https://files.cnblogs.com/files/nihaorz/docker-logs-format-1.0-SNAPSHOT-jar-with-dependencies.jar.zip

原文地址:https://www.cnblogs.com/nihaorz/p/10281555.html

时间: 2024-10-08 02:29:30

使用jar包格式化Docker 容器日志的相关文章

日志系统之基于flume收集docker容器日志

最近我在日志收集的功能中加入了对docker容器日志的支持.这篇文章简单谈谈策略选择和处理方式. 关于docker的容器日志 docker 我就不多说了,这两年火得发烫.最近我也正在把日志系统的一些组件往docker里部署.很显然,组件跑在容器里之后很多东西都会受到容器的制约,比如日志文件就是其中之一. 当一个组件部署到docker中时,你可以通过如下命令在标准输出流(命令行)中查看这个组件的日志: docker logs ${containerName} 日志形如: 但这种方式并不能让你实时获

Docker容器日志清理

前言 最近发现公司Gitlab服务器磁盘满了,经排查发现是docker容器日志占用了几十个G容量,那么这些日志怎么去查看和清理呢? 本节主要讲到的知识点如下: (1)Docker容器日志路径 (2)如何清理Docker容器日志 (3)如何从根本上解决Docker容器日志占用空间问题 Docker容器日志路径 在linux上,容器日志一般存放在/var/lib/docker/containers/container_id/下面,以json.log结尾的文件(业务日志).如下: 如何清理Docker

Docker容器日志管理介绍

Docker容器日志分为2类: Docker引擎日志(Docker本身运行的日志). 容器日志,各个容器内产生的日志. Docker引擎日志Centos系统下Docker引擎log一般给systemd管理,可通过 journalctl -u docker.service 命令查看. 容器日志一.查看日志命令docker logs 容器ID 显示当前运行容器的log,输出Linux下的STDOUT(标准输出).STDERR(标准错误输出),docker logs 显示的内容包含STDOUT和STD

docker logs-查看docker容器日志

只限制最后100条的日志,并持续更新日志显示 docker logs -f --tail=100 CONTAINER_ID docker logs -f --tail 100 CONTAINER_ID https://docs.docker.com/engine/reference/commandline/logs/ https://www.jianshu.com/p/1eb1d1d3f25e 分类: docker系列 标签: docker logs-查看docker容器日志 原文地址:http

Docker 容器日志的那些事儿

如果时光可以倒流,现实世界的每一步都可以分解到最小,记录下来,就是日志,万物即日志. 面对历史,审视日志,可以选择忘却,也可以选择铭记:经历过的,可以选择珍藏,同样也可以让它尘封. Docker容器又何尝不是?日志就像一根时间轴,你在或者不在,他都在那.有人对其善意,有人却对其随意.如若不信,可以回忆,自己是否善待Docker容器的日志. 1.传统应用的日志 如若不是被过去伤得太深,踏入一个新的世界,应该还是会怀念过往的吧.新世界的"诱惑"与崭新的节奏,相信依旧无法掩盖旧世界的铅印.数

jar包创建docker镜像

写个dockerfile文件 FROM openjdk:8-jre-alpine COPY target/你的jar包.jar /app.jar CMD java -Xms256m -Xmx512m -Xmn128m -Duser.timezone=GMT+08 -jar app.jar 在dockerfile文件目录执行命令打包镜像 docker build -t 镜像名字:镜像tag . 原文地址:https://blog.51cto.com/chend/2453211

[笔记]使用Go语言Redigo包在Docker容器内连接Redis容器的方法

Docker容器之间的连接可以带来不少方便,下面记录下如何在自己容器内通过环境变量连接与之连接的Redis容器的方法. 先起一个Redis的Docker容器,命名为 redis,再起一个自己的Docker容器,使用"--link redis:redis"方式与redis容器连接. 在自己的容器内部,会有对应的环境变量,其中这里用的就是 REDIS_PORT = tcp://172.17.0.89:6379. 将其分拆为 tcp 和 172.17.0.89:6379,作为参数传入redi

Graylog2实现Docker容器日志收集

Graylog2 是一个开源的日志存储系统,是由java语言编写的server,能够接收TCP,UDP,AMQP的协议发送的日志信息,并且基于mongodb数据库服务器快速存储,能够通过一个基于ruby编写的web管理界面,让轻松管理你的日志. 1.组件准备 名称 组件名称 备注 1 mongodb 2 elasticsearch 3 graylog2 2.安装使用Docker-compose部署docker-compose安装,参考:http://hujianxiong.com/linuxan

【docker】docker logs-查看docker容器日志

引用地址 https://www.jianshu.com/p/1eb1d1d3f25e 通过docker logs命令可以查看容器的日志. 命令格式: $ docker logs [OPTIONS] CONTAINER Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟) --tail string 从日志末尾显示多少行日志, 默认是all -t, -