小小这里对后端日志技术体系进行分析,这里将会阐述后端日志的前世今生。从小到大

程序控制台日志

这里使用System.out.println 进行打印,输出相关的控制台的信息。编写代码如下

System.out.println("hello world")

这里将会直接输出相关的日志内容:

Hello World

这就完成了最简单的程序控制台的日志的输出

单体应用日志

这里将会针对单体应用,实现相关的日志系统。这里主要使用的将会是Log4J,slf4j 这里针对单体应用实现简单的入门

Log4J

新建maven文件

<!-- log4j support -->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

新建配置文件

这里进行新建配置文件 配置文件信息如下

 ### 设置###
log4j.rootLogger = debug,stdout,D,E### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 输出DEBUG 级别以上的日志到=/home/duqi/logs/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /home/duqi/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 输出ERROR 级别以上的日志到=/home/admin/logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/home/admin/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

输出日志

这里进行日志的信息的输出 使用 logger.debug 进行简单的输出

package com.javadu.log;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Log4JTest {private static final Logger logger = LoggerFactory.getLogger(Log4JTest.class);public static void main(String[] args) {// 记录debug级别的信息logger.debug("This is debug message.");// 记录info级别的信息logger.info("This is info message.");// 记录error级别的信息logger.error("This is error message.");}
}

控制台输出

这里控制台进行相关的输出。输出的内容如下

如此就完成了控制台的基本的输出

slf4j

这里针对 slf4j 进行相关的输出。

定义

什么是slf4j slf4j只是定义了一组日志接口,但并未提供任何实现 只需要针对这个日志接口进行相关的实践,就能完成基本的定义。

使用教程

添加maven包

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version>
</dependency>

添加两个日志的关联包

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version>
</dependency>

针对代码声明进行更改

这里针对代码的声明进行相关的更改

import org.apache.log4j.Logger;
class Test {final Logger log = Logger.getLogger(Test.class);public void test() {log.info("hello this is log4j info log");}
}

更改为

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class Test {Logger log = LoggerFactory.getLogger(Test.class);public void test() {log.info("hello, my name is {}", "chengyi");}
}

这样就完成了两个日志的联合使用

ELK使用

这里添加ELK进行基本的使用

三个软件的简介

Logstash

Logstash 主要用于收集服务器日志,它是一个开源数据收集引擎,具有实时管道功能。Logstash 可以动态地将来自不同数据源的数据统一起来,并将数据标准化到您所选择的目的地。

Logstash 收集数据的过程主要分为以下三个部分:

输入:数据(包含但不限于日志)往往都是以不同的形式、格式存储在不同的系统中,而 Logstash 支持从多种数据源中收集数据(File、Syslog、MySQL、消息中间件等等)。过滤器:实时解析和转换数据,识别已命名的字段以构建结构,并将它们转换成通用格式。输出:Elasticsearch 并非存储的唯一选择,Logstash 提供很多输出选择。

Elasticsearch

Elasticsearch (ES)是一个分布式的 Restful 风格的搜索和数据分析引擎,它具有以下特点:

查询:允许执行和合并多种类型的搜索 — 结构化、非结构化、地理位置、度量指标 — 搜索方式随心而变。分析:Elasticsearch 聚合让您能够从大处着眼,探索数据的趋势和模式。速度:很快,可以做到亿万级的数据,毫秒级返回。可扩展性:可以在笔记本电脑上运行,也可以在承载了 PB 级数据的成百上千台服务器上运行。弹性:运行在一个分布式的环境中,从设计之初就考虑到了这一点。灵活性:具备多个案例场景。支持数字、文本、地理位置、结构化、非结构化,所有的数据类型都欢迎。

Kibana

Kibana 可以使海量数据通俗易懂。它很简单,基于浏览器的界面便于您快速创建和分享动态数据仪表板来追踪 Elasticsearch 的实时数据变化。其搭建过程也十分简单,您可以分分钟完成 Kibana 的安装并开始探索 Elasticsearch 的索引数据 — 没有代码、不需要额外的基础设施。

对于以上三个组件在 《ELK 协议栈介绍及体系结构》 一文中有具体介绍,这里不再赘述。

在 ELK 中,三大组件的大概工作流程如下图所示,由 Logstash 从各个服务中采集日志并存放至 Elasticsearch 中,然后再由 Kiabana 从 Elasticsearch 中查询日志并展示给终端用户。

图 1. ELK 的大致工作流程图 1. ELK 的大致工作流程

安装 Logstash

  1. 解压压缩包:

tar -xzvf logstash-7.3.0.tar.gz
  1. 简单用例测试,进入到解压目录,并启动一个将控制台输入输出到控制台的管道。

cd logstash-7.3.0
elk@elk:~/elk/logstash-7.3.0$ bin/logstash -e 'input { stdin {} } output { { stdout {} } }'
  1. Logstash 启动成功日志

安装 Elasticsearch

  1. 解压安装包

tar -xzvf elasticsearch-7.3.0-linux-x86_64.tar.gz
  1. 启动 Elasticsearch:

cd elasticsearch-7.3.0/
bin/elasticsearch

安装 Kibana

  1. 解压安装包:

tar -xzvf kibana-7.3.0-linux-x86_64.tar.gz
  1. 修改配置文件 config/kibana.yml ,主要指定 Elasticsearch 的信息。

#Elasticsearch主机地址
elasticsearch.hosts: "http://ip:9200"
# 允许远程访问
server.host: "0.0.0.0"
# Elasticsearch用户名 这里其实就是我在服务器启动Elasticsearch的用户名
elasticsearch.username: "es"
# Elasticsearch鉴权密码 这里其实就是我在服务器启动Elasticsearch的密码
elasticsearch.password: "es"
  1. 启动 Kibana:

启动 Kibana:

cd kibana-7.3.0-linux-x86_64/bin
./kibana
  1. 在浏览器中访问 http://ip:5601 ,若出现以下界面,则表示 Kibana 安装成功。

在 Spring Boot 中使用 ELK

修改并部署 Spring Boot 项目

  1. 在项目 resources 目录下创建 spring-logback.xml 配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><contextName>Logback For demo Mobile</contextName><property name="LOG_HOME" value="/log" /><springProperty scope="context" name="appName" source="spring.application.name"defaultValue="localhost" />...<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">...<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{25} ${appName} -%msg%n</pattern></encoder>...</appender>...
</configuration>
  1. 打包并部署 Spring Boot 项目

# 打包命令
mvn package -Dmaven.test.skip=true
# 部署命令
java -jar sb-elk-start-0.0.1-SNAPSHOT.jar
  1. 查看日志文件, logback 配置文件中我将日志存放在 /log/sb-log.log 文件中,执行 more /log/sb-log.log 命令,出现以下结果表示部署成功。

docker 日志

查看容器日志

先使用  docker run -it --rm -d -p 80:80 nginx:1.15.8-alpine 命令启动一个nginx容器。如果没有异常,会得到容器ID如  d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00  的长串。再使用  curl -i http://127.0.0.1  访问服务,确认nginx容器正常启动运行。最后使用  docker logs -f d24  查看容器的日志输出,大概如下:

172.17.0.1 - - [24/Mar/2019:03:51:21 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

容器日志文件存储

容器的日志会以json文件方式存储在本地磁盘,可以使用下面方式查看文件路径  docker inspect d42 | grep Log 可以找到:

"LogPath": "/var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.log",

容器日志文件滚动策略

docker容器日志默认写入json文件,在线上运行时候会有磁盘写满的风险。可以调整策略,让其进行滚动。修改/etc/docker/daemon.json(如果没有就手工创建一个),增加下面内容:

{"log-opts": {"max-size": "1m","max-file": "3"}
}

k8s 日志信息

编写yml进行相关的配置信息

apiVersion: v1
kind: Pod
metadata:name: counter
spec:containers:- name: countimage: busyboxargs: [/bin/sh, -c,'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']

获取日志信息

[root@node1 blog]# kubectl get pod |grep counter
counter            1/1     Running   0          9s
[root@node1 blog]# kubectl logs counter
0: Fri May 17 00:34:01 UTC 2019
1: Fri May 17 00:34:02 UTC 2019
2: Fri May 17 00:34:03 UTC 2019
3: Fri May 17 00:34:04 UTC 2019
4: Fri May 17 00:34:05 UTC 2019
5: Fri May 17 00:34:06 UTC 2019
6: Fri May 17 00:34:07 UTC 2019
7: Fri May 17 00:34:08 UTC 2019
8: Fri May 17 00:34:09 UTC 2019
9: Fri May 17 00:34:10 UTC 2019
10: Fri May 17 00:34:11 UTC 2019
11: Fri May 17 00:34:12 UTC 2019
12: Fri May 17 00:34:13 UTC 2019

这样就完成了一个比较简单的日志信息的收集。

小明菜市场

推荐阅读

● 实战 | Java 流之Stream,Lambda以及日期

● 理论 | 优雅的构建一个健壮的API接口

● 实战 | webmagic爬取实战之爬取保险经纪人信息

● 实战 | WebMagic 爬取某保险经纪人网站经纪人列表之网站列表爬取

● 实战 | WebMagic 实现分布式爬虫

实战 | 后端日志的前世今生相关推荐

  1. 苏嵌项目实战 学习日志1

    苏嵌项目实战 学习日志1 姓名:王尹新叶 日期: 2018/09/03 今日学习任务 安装VM,学习用虚拟机运行Linux系统,复习C语言知识,进行相关操作. 今日任务完成情况 安装完VM,并在虚拟机 ...

  2. Liunx下的日志清理shell脚本实战之日志备份

    Liunx下的日志清理shell脚本实战 一.脚本实现功能以及要求 二.shell脚本内容 一.脚本实现功能以及要求 二.shell脚本内容 一.脚本实现功能以及要求 1.日志备份目录,将日志备份到/ ...

  3. SLS机器学习最佳实战:日志聚类+异常告警

    0.文章系列链接 SLS机器学习介绍(01):时序统计建模 SLS机器学习介绍(02):时序聚类建模 SLS机器学习介绍(03):时序异常检测建模 SLS机器学习介绍(04):规则模式挖掘 SLS机器 ...

  4. shell实战之日志脱敏

    本次实战目标为日志脱敏,将日志目录内的所有文件进行处理,凡是涉及到卡号和密码的信息,一律以"*"号替代,要替代的内容都从对应的标签内获取,本脚本执行目录 drwxr-xr-x 5 ...

  5. 后端日志【11】:回归自我,负重前行

    2018年11月5日 距离上一篇日志,居然已经过去了3个月了,是的,就是那么的忙碌,没有闲心静下来好好总结自己,今日8点多到公司,做个总结吧,捋顺了然后解除迷惘再出发. 一.2018/3/4 - 20 ...

  6. 项目实训-智能生物序列分析平台-药物推荐后端日志

    在经过与老师的探讨后,我们决定将之前创新实训的课题,继续深挖,开发一套基于人工智能模型的生物序列分析平台,内置了传统nlp模型与生物信息中的各类模型的整合,打算做到60个算法的集合,最终我们实现了两个 ...

  7. 企业项目实战---ELK日志分析平台之logstash数据采集(二)

    ELK日志分析平台 logstash数据采集 1.logstash简介 2.Logstash安装 3.标准输入到标准输出 4.标准输入到文件 5.标准输入到es主机 6.指定文件输入到es主机 7.s ...

  8. ElasticSearch实战-日志监控平台

    1.概述 在项目业务倍增的情况下,查询效率受到影响,这里我们经过讨论,引进了分布式搜索套件--ElasticSearch,通过分布式搜索来解决当下业务上存在的问题.下面给大家列出今天分析的目录: El ...

  9. keepalived 高可用日志说明及实战配置日志路径

    日志文件查看 tail -f /var/log/message 修改日志路径 vi /etc/sysconfig/keepalived KEEPALIVED_OPTIONS="-D -S 0 ...

最新文章

  1. 2013-3-10日记
  2. “算法不行,干啥都不行!”面试官:面试基本都会考这点!
  3. 使用VS2008进行WEB负载测试
  4. 比特币经历价格过山车 理财还是乐金所、ppmoney网贷靠谱
  5. Python基础教程:列表字典的键值修改
  6. boost::hana::make用法的测试程序
  7. 011_Validation Rule about Time
  8. 网络协议,我明明学过的呀?
  9. 疑 Android N 截图曝光,通知栏对比上一代变了不少
  10. oracle增加表字段_史上最详细的oracle 中的CR块介绍--一致性读
  11. 在浏览器用域名访问发现跳转到IIS Windows 界面
  12. 利用Tushare合成期货主力连续数据
  13. java编译器哪个好_java编译器什么好?java编译器工作原理是什么?
  14. java做节奏大师,节奏大师:音浪太强太迷茫?做到这些轻轻松松成为“节奏大师”...
  15. 经济型EtherCAT运动控制器(六):数据储存
  16. 【开箱即用】VMware Win7虚拟机下载
  17. 算法设计与分析-TSP六种方法-贪心算法(最近邻点、最短链接)、蛮力法、动态规划法、回溯法、分支限界法、模拟退火
  18. ARM汇编(gun-complier)
  19. pandas数据分析模块(二)
  20. UNT413-S905L3机顶盒线刷记录

热门文章

  1. nginx的root和alias指令的区别
  2. IBM云计算架构师:Mesos新功能以及roadmap简介
  3. erlang的cpu调优
  4. Craigslist模式在中国如何复制?中国特色的差异化在哪里?,互联网营销
  5. 关闭和启动Oracle的几种方法总结
  6. NGINX1.19安装手册
  7. 简单的js网页计算机代码,简易js代码实现计算器操作
  8. 最简单红米手机如何没root激活XPOSED框架
  9. 彻底搞懂浏览器Event-loop 1
  10. JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池