标签 日志 下的文章

本文摘自为 Linux 小白(或者非资深桌面用户)传授技巧的系列文章。该系列文章旨在为 LinuxMagazine 发布的第 30 期特别版 “Linux 入门” (基于 openSUSE Leap )提供补充说明。

本文作者是 Romeo S.,她是一名基于 PDX 的企业 Linux 专家,专注于为创新企业提供富有伸缩性的解决方案。

Linux 系统日志非常重要。后台运行的程序(通常被称为守护进程或者服务进程)处理了你 Linux 系统中的大部分任务。当这些守护进程工作时,它们将任务的详细信息记录进日志文件中,作为它们做过什么的“历史”信息。这些守护进程的工作内容涵盖从使用原子钟同步时钟到管理网络连接。所有这些都被记录进日志文件,这样当有错误发生时,你可以通过查阅特定的日志文件来看出发生了什么。

Photo by Markus Spiske on Unsplash

在你的 Linux 计算机上有很多不同的日志。历史上,它们一般以纯文本的格式存储到 /var/log 目录中。现在依然有很多日志这样做,你可以很方便的使用 less 来查看它们。

在新装的 openSUSE Leap 42.3 以及大多数现代操作系统上,重要的日志由 systemd 初始化系统存储。 systemd这套系统负责启动守护进程,并在系统启动时让计算机做好被使用的准备。由 systemd 记录的日志以二进制格式存储,这使得它们消耗的空间更小,更容易被浏览,也更容易被导出成其他各种格式,不过坏处就是你必须使用特定的工具才能查看。好在这个工具已经预安装在你的系统上了:它的名字叫 journalctl,而且默认情况下,它会将每个守护进程的所有日志都记录到一个地方。

只需要运行 journalctl 命令就能查看你的 systemd 日志了。它会用 less 分页器显示各种日志。为了让你有个直观的感受, 下面是 journalctl 中摘录的一条日志记录:

Jul 06 11:53:47 aaathats3as pulseaudio[2216]: [pulseaudio] alsa-util.c: Disabling timer-based scheduling because running inside a VM.

这条独立的日志记录以此包含了记录的日期和时间、计算机名、记录日志的进程名、记录日志的进程 PID,以及日志内容本身。

若系统中某个程序运行出问题了,则可以查看日志文件并搜索(使用 / 加上要搜索的关键字)程序名称。有可能导致该程序出问题的错误会记录到系统日志中。 有时,错误信息会足够详细到让你能够修复该问题。其他时候,你需要在 Web 上搜索解决方案。 Google 就很适合来搜索奇怪的 Linux 问题。不过搜索时请注意你只输入了日志的实际内容,行首的那些信息(日期、主机名、进程 ID) 对搜索来说是无意义的,会干扰搜索结果。

解决方法一般在搜索结果的前几个连接中就会有了。当然,你不能只是无脑得运行从互联网上找到的那些命令:请一定先搞清楚你要做的事情是什么,它的效果会是什么。据说,搜索系统日志中的特定条目要比直接描述该故障通用关键字要有用的多。因为程序出错有很多原因,而且同样的故障表现也可能由多种问题引发的。

比如,系统无法发声的原因有很多,可能是播放器没有插好,也可能是声音系统出故障了,还可能是缺少合适的驱动程序。如果你只是泛泛的描述故障表现,你会找到很多无关的解决方法,而你也会浪费大量的时间。而专门搜索日志文件中的实际内容,你也许会查询出其它人也有相同日志内容的结果。

你可以对比一下图 1 和图 2。

图 1 搜索系统的故障表现只会显示泛泛的,不精确的结果。这种搜索通常没什么用。

图 2 搜索特定的日志行会显示出精确的,有用的结果。这种搜索通常很有用。

也有一些系统不用 journalctl 来记录日志。在桌面系统中最常见的这类日志包括用于记录 openSUSE 包管理器的行为的 /var/log/zypper.log; 记录系统启动时消息的 /var/log/boot.log ,开机时这类消息往往滚动的特别快,根本看不过来;/var/log/ntp 用来记录 Network Time Protocol (NTP)守护进程同步时间时发生的错误。 另一个存放硬件故障信息的地方是 “Kernel Ring Buffer”(内核环状缓冲区),你可以输入 demesg -H 命令来查看(这条命令也会调用 less 分页器来查看)。“Kernel Ring Buffer” 存储在内存中,因此会在重启电脑后丢失。不过它包含了 Linux 内核中的重要事件,比如新增了硬件、加载了模块,以及奇怪的网络错误.

希望你已经准备好深入了解你的 Linux 系统了! 祝你玩的开心!


via: https://www.suse.com/communities/blog/system-logs-understand-linux-system/

作者:[chabowski] 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你是否厌烦了那些使用复杂语言编写的、难以部署的、总是在不停构建的解决方案?Golang 是解决这些问题的好方法,它和 C 语言一样快,又和 Python 一样简单。

但是你是如何使用 Golang 日志监控你的应用程序的呢?Golang 没有异常,只有错误。因此你的第一印象可能就是开发 Golang 日志策略并不是一件简单的事情。不支持异常事实上并不是什么问题,异常在很多编程语言中已经失去了其异常性:它们过于被滥用以至于它们的作用都被忽视了。

在进一步深入之前,我们首先会介绍 Golang 日志的基础,并讨论 Golang 日志标准、元数据意义、以及最小化 Golang 日志对性能的影响。通过日志,你可以追踪用户在你应用中的活动,快速识别你项目中失效的组件,并监控总体性能以及用户体验。

I. Golang 日志基础

1) 使用 Golang “log” 库

Golang 给你提供了一个称为 “log” 的原生日志库 。它的日志器完美适用于追踪简单的活动,例如通过使用可用的选项在错误信息之前添加一个时间戳。

下面是一个 Golang 中如何记录错误日志的简单例子:

package main

import (
    "log"
    "errors"
    "fmt"
    )

func main() {
   /* 定义局部变量 */
  ...

   /* 除法函数,除以 0 的时候会返回错误 */
   ret,err = div(a, b)
if err != nil {
 log.Fatal(err)
    }
    fmt.Println(ret)
}

如果你尝试除以 0,你就会得到类似下面的结果:

为了快速测试一个 Golang 函数,你可以使用 go playground

为了确保你的日志总是能轻易访问,我们建议你把它们写到一个文件:

package main
import (
        "log"
        "os"
)
func main() {
        // 按照所需读写权限创建文件
        f, err := os.OpenFile("filename", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
        if err != nil {
                log.Fatal(err)
        }   
        // 完成后延迟关闭,而不是习惯!
        defer f.Close()
        //设置日志输出到 f
        log.SetOutput(f)
        //测试用例
        log.Println("check to make sure it works")
}

你可以在这里找到 Golang 日志的完整指南,以及 “log” 内可用函数的完整列表。

现在你就可以记录它们的错误以及根本原因啦。

另外,日志也可以帮你将活动流拼接在一起,查找需要修复的错误上下文,或者调查在你的系统中单个请求如何影响其它应用层和 API。

为了获得更好的日志效果,你首先需要在你的项目中使用尽可能多的上下文丰富你的 Golang 日志,并标准化你使用的格式。这就是 Golang 原生库能达到的极限。使用最广泛的库是 gloglogrus。必须承认还有很多好的库可以使用。如果你已经在使用支持 JSON 格式的库,你就不需要再换其它库了,后面我们会解释。

II. 为你 Golang 日志统一格式

1) JSON 格式的结构优势

在一个项目或者多个微服务中结构化你的 Golang 日志可能是最困难的事情,但一旦完成就很轻松了。结构化你的日志能使机器可读(参考我们 收集日志的最佳实践博文)。灵活性和层级是 JSON 格式的核心,因此信息能够轻易被人类和机器解析以及处理。

下面是一个使用 Logrus/Logmatic.io 如何用 JSON 格式记录日志的例子:

package main
import (
  log "github.com/Sirupsen/logrus"
  "github.com/logmatic/logmatic-go"
)
func main() {
    // 使用 JSONFormatter
    log.SetFormatter(&logmatic.JSONFormatter{})
        // 使用 logrus 像往常那样记录事件
    log.WithFields(log.Fields{"string": "foo", "int": 1, "float": 1.1 }).Info("My first ssl event from golang")
}

会输出结果:

{   
    "date":"2016-05-09T10:56:00+02:00",
    "float":1.1,
    "int":1,
    "level":"info",
    "message":"My first ssl event from golang",
    "String":"foo"
}

2) 标准化 Golang 日志

同一个错误出现在你代码的不同部分,却以不同形式被记录下来是一件可耻的事情。下面是一个由于一个变量错误导致无法确定 web 页面加载状态的例子。一个开发者日志格式是:

message: 'unknown error: cannot determine loading status from unknown error: missing or invalid arg value client'</span>

另一个人的格式却是:

unknown error: cannot determine loading status - invalid client</span>

强制日志标准化的一个好的解决办法是在你的代码和日志库之间创建一个接口。这个标准化接口会包括所有你想添加到你日志中的可能行为的预定义日志消息。这么做可以防止出现不符合你想要的标准格式的自定义日志信息。这么做也便于日志调查。

由于日志格式都被统一处理,使它们保持更新也变得更加简单。如果出现了一种新的错误类型,它只需要被添加到一个接口,这样每个组员都会使用完全相同的信息。

最常使用的简单例子就是在 Golang 日志信息前面添加日志器名称和 id。你的代码然后就会发送 “事件” 到你的标准化接口,它会继续讲它们转化为 Golang 日志消息。

// 主要部分,我们会在这里定义所有消息。
// Event 结构体很简单。为了当所有信息都被记录时能检索它们,
// 我们维护了一个 Id
var (
    invalidArgMessage = Event{1, "Invalid arg: %s"}
    invalidArgValueMessage = Event{2, "Invalid arg value: %s => %v"}
    missingArgMessage = Event{3, "Missing arg: %s"}
)

// 在我们应用程序中可以使用的所有日志事件
func (l *Logger)InvalidArg(name string) {
    l.entry.Errorf(invalidArgMessage.toString(), name)
}
func (l *Logger)InvalidArgValue(name string, value interface{}) {
    l.entry.WithField("arg." + name, value).Errorf(invalidArgValueMessage.toString(), name, value)
}
func (l *Logger)MissingArg(name string) {
    l.entry.Errorf(missingArgMessage.toString(), name)
}

因此如果我们使用前面例子中无效的参数值,我们就会得到相似的日志信息:

time="2017-02-24T23:12:31+01:00" level=error msg="LoadPageLogger00003 - Missing arg: client - cannot determine loading status" arg.client=<nil> logger.name=LoadPageLogger

JSON 格式如下:

{"arg.client":null,"level":"error","logger.name":"LoadPageLogger","msg":"LoadPageLogger00003 - Missing arg: client - cannot determine loading status", "time":"2017-02-24T23:14:28+01:00"}

III. Golang 日志上下文的力量

现在 Golang 日志已经按照特定结构和标准格式记录,时间会决定需要添加哪些上下文以及相关信息。为了能从你的日志中抽取信息,例如追踪一个用户活动或者工作流,上下文和元数据的顺序非常重要。

例如在 logrus 库中可以按照下面这样使用 JSON 格式添加 hostnameappnamesession 参数:

// 对于元数据,通常做法是通过复用来重用日志语句中的字段。
  contextualizedLog := log.WithFields(log.Fields{
    "hostname": "staging-1",
    "appname": "foo-app",
    "session": "1ce3f6v"
  })
contextualizedLog.Info("Simple event with global metadata")

元数据可以视为 javascript 片段。为了更好地说明它们有多么重要,让我们看看几个 Golang 微服务中元数据的使用。你会清楚地看到是怎么在你的应用程序中跟踪用户的。这是因为你不仅需要知道一个错误发生了,还要知道是哪个实例以及什么模式导致了错误。假设我们有两个按顺序调用的微服务。上下文信息保存在头部(header)中传输:

func helloMicroService1(w http.ResponseWriter, r *http.Request) {
client := &http.Client{}
// 该服务负责接收所有到来的用户请求
// 我们会检查是否是一个新的会话还是已有会话的另一次调用
session := r.Header.Get("x-session")
if ( session == "") {
session = generateSessionId()
// 为新会话记录日志
}
// 每个请求的 Track Id 都是唯一的,因此我们会为每个会话生成一个
track := generateTrackId()
// 调用你的第二个微服务,添加 session/track
reqService2, _ := http.NewRequest("GET", "http://localhost:8082/", nil)
reqService2.Header.Add("x-session", session)
reqService2.Header.Add("x-track", track)
resService2, _ := client.Do(reqService2)
….

当调用第二个服务时:

func helloMicroService2(w http.ResponseWriter, r *http.Request) {
// 类似之前的微服务,我们检查会话并生成新的 track
session := r.Header.Get("x-session")
track := generateTrackId()
// 这一次,我们检查请求中是否已经设置了一个 track id,
// 如果是,它变为父 track
parent := r.Header.Get("x-track")
if (session == "") {
w.Header().Set("x-parent", parent)
}
// 为响应添加 meta 信息
w.Header().Set("x-session", session)
w.Header().Set("x-track", track)
if (parent == "") {
w.Header().Set("x-parent", track)
}
// 填充响应
w.WriteHeader(http.StatusOK)
io.WriteString(w, fmt.Sprintf(aResponseMessage, 2, session, track, parent))
}

现在第二个微服务中已经有和初始查询相关的上下文和信息,一个 JSON 格式的日志消息看起来类似如下。

在第一个微服务:

{"appname":"go-logging","level":"debug","msg":"hello from ms 1","session":"eUBrVfdw","time":"2017-03-02T15:29:26+01:00","track":"UzWHRihF"}

在第二个微服务:

{"appname":"go-logging","level":"debug","msg":"hello from ms 2","parent":"UzWHRihF","session":"eUBrVfdw","time":"2017-03-02T15:29:26+01:00","track":"DPRHBMuE"}

如果在第二个微服务中出现了错误,多亏了 Golang 日志中保存的上下文信息,现在我们就可以确定它是怎样被调用的以及什么模式导致了这个错误。

如果你想进一步深挖 Golang 的追踪能力,这里还有一些库提供了追踪功能,例如 Opentracing。这个库提供了一种简单的方式在或复杂或简单的架构中添加追踪的实现。它通过不同步骤允许你追踪用户的查询,就像下面这样:

IV. Golang 日志对性能的影响

1) 不要在 Goroutine 中使用日志

在每个 goroutine 中创建一个新的日志器看起来很诱人。但最好别这么做。Goroutine 是一个轻量级线程管理器,它用于完成一个 “简单的” 任务。因此它不应该负责日志。它可能导致并发问题,因为在每个 goroutine 中使用 log.New() 会重复接口,所有日志器会并发尝试访问同一个 io.Writer。

为了限制对性能的影响以及避免并发调用 io.Writer,库通常使用一个特定的 goroutine 用于日志输出。

2) 使用异步库

尽管有很多可用的 Golang 日志库,要注意它们中的大部分都是同步的(事实上是伪异步)。原因很可能是到现在为止它们中没有一个会由于日志严重影响性能。

但正如 Kjell Hedström 在他的实验中展示的,使用多个线程创建成千上万日志,即便是在最坏情况下,异步 Golang 日志也会有 40% 的性能提升。因此日志是有开销的,也会对你的应用程序性能产生影响。如果你并不需要处理大量的日志,使用伪异步 Golang 日志库可能就足够了。但如果你需要处理大量的日志,或者很关注性能,Kjell Hedström 的异步解决方案就很有趣(尽管事实上你可能需要进一步开发,因为它只包括了最小的功能需求)。

3)使用严重等级管理 Golang 日志

一些日志库允许你启用或停用特定的日志器,这可能会派上用场。例如在生产环境中你可能不需要一些特定等级的日志。下面是一个如何在 glog 库中停用日志器的例子,其中日志器被定义为布尔值:

type Log bool
func (l Log) Println(args ...interface{}) {
    fmt.Println(args...)
}
var debug Log = false
if debug {
    debug.Println("DEBUGGING")
}

然后你就可以在配置文件中定义这些布尔参数来启用或者停用日志器。

没有一个好的 Golang 日志策略,Golang 日志可能开销很大。开发人员应该抵制记录几乎所有事情的诱惑 - 尽管它非常有趣!如果日志的目的是为了获取尽可能多的信息,为了避免包含无用元素的日志的白噪音,必须正确使用日志。

V. 集中化 Golang 日志

如果你的应用程序是部署在多台服务器上的,这样可以避免为了调查一个现象需要连接到每一台服务器的麻烦。日志集中确实有用。

使用日志装箱工具,例如 windows 中的 Nxlog,linux 中的 Rsyslog(默认安装了的)、Logstash 和 FluentD 是最好的实现方式。日志装箱工具的唯一目的就是发送日志,因此它们能够处理连接失效以及其它你很可能会遇到的问题。

这里甚至有一个 Golang syslog 软件包 帮你将 Golang 日志发送到 syslog 守护进程。

希望你享受你的 Golang 日志之旅

在你项目一开始就考虑你的 Golang 日志策略非常重要。如果在你代码的任意地方都可以获得所有的上下文,追踪用户就会变得很简单。从不同服务中阅读没有标准化的日志是已经很痛苦的事情。一开始就计划在多个微服务中扩展相同用户或请求 id,后面就会允许你比较容易地过滤信息并在你的系统中跟踪活动。

你是在构架一个很大的 Golang 项目还是几个微服务也会影响你的日志策略。一个大项目的主要组件应该有按照它们功能命名的特定 Golang 日志器。这使你可以立即判断出日志来自你的哪一部分代码。然而对于微服务或者小的 Golang 项目,只有较少的核心组件需要它们自己的日志器。但在每种情形中,日志器的数目都应该保持低于核心功能的数目。

你现在已经可以使用 Golang 日志量化决定你的性能或者用户满意度啦!

如果你有想阅读的特定编程语言,在 Twitter @logmatic 上告诉我们吧。


via: https://logmatic.io/blog/our-guide-to-a-golang-logs-world/

作者:Nils 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Elasticsearch 是基于 Lucene 由 Java 开发的开源搜索引擎。它提供了一个分布式、多租户的全文搜索引擎(LCTT 译注:多租户是指多租户技术,是一种软件架构技术,用来探讨与实现如何在多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。),并带有 HTTP 仪表盘的 Web 界面(Kibana)。数据会被 Elasticsearch 查询、检索,并且使用 JSON 文档方案存储。Elasticsearch 是一个可扩展的搜索引擎,可用于搜索所有类型的文本文档,包括日志文件。Elasticsearch 是 Elastic Stack 的核心,Elastic Stack 也被称为 ELK Stack。

Logstash 是用于管理事件和日志的开源工具。它为数据收集提供实时传递途径。 Logstash 将收集您的日志数据,将数据转换为 JSON 文档,并将其存储在 Elasticsearch 中。

Kibana 是 Elasticsearch 的开源数据可视化工具。Kibana 提供了一个漂亮的仪表盘 Web 界面。 你可以用它来管理和可视化来自 Elasticsearch 的数据。 它不仅美丽,而且强大。

在本教程中,我将向您展示如何在 CentOS 7 服务器上安装和配置 Elastic Stack 以监视服务器日志。 然后,我将向您展示如何在操作系统为 CentOS 7 和 Ubuntu 16 的客户端上安装 “Elastic beats”。

前提条件

  • 64 位的 CentOS 7,4 GB 内存 - elk 主控机
  • 64 位的 CentOS 7 ,1 GB 内存 - 客户端 1
  • 64 位的 Ubuntu 16 ,1 GB 内存 - 客户端 2

步骤 1 - 准备操作系统

在本教程中,我们将禁用 CentOS 7 服务器上的 SELinux。 编辑 SELinux 配置文件。

vim /etc/sysconfig/selinux

SELINUX 的值从 enforcing 改成 disabled

SELINUX=disabled

然后重启服务器:

reboot

再次登录服务器并检查 SELinux 状态。

getenforce

确保结果是 disabled

步骤 2 - 安装 Java

部署 Elastic stack 依赖于Java,Elasticsearch 需要 Java 8 版本,推荐使用 Oracle JDK 1.8 。我将从官方的 Oracle rpm 包安装 Java 8。

使用 wget 命令下载 Java 8 的 JDK。

wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http:%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u77-b02/jdk-8u77-linux-x64.rpm"

然后使用 rpm 命令安装:

rpm -ivh jdk-8u77-linux-x64.rpm

最后,检查 java JDK 版本,确保它正常工作。

java -version

您将看到服务器的 Java 版本。

步骤 3 - 安装和配置 Elasticsearch

在此步骤中,我们将安装和配置 Elasticsearch。 从 elastic.co 网站提供的 rpm 包安装 Elasticsearch,并将其配置运行在 localhost 上(以确保该程序安全,而且不能从外部访问)。

在安装 Elasticsearch 之前,将 elastic.co 的密钥添加到服务器。

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

接下来,使用 wget 下载 Elasticsearch 5.1,然后安装它。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.rpm
rpm -ivh elasticsearch-5.1.1.rpm

Elasticsearch 已经安装好了。 现在进入配置目录编辑 elasticsaerch.yml 配置文件。

cd /etc/elasticsearch/
vim elasticsearch.yml

去掉第 40 行的注释,启用 Elasticsearch 的内存锁。这将禁用 Elasticsearch 的内存交换。

bootstrap.memory_lock: true

Network 块中,取消注释 network.hosthttp.port 行。

network.host: localhost
http.port: 9200

保存文件并退出编辑器。

现在编辑 elasticsearch.service 文件的内存锁配置。

vim /usr/lib/systemd/system/elasticsearch.service

去掉第 60 行的注释,确保该值为 unlimited

MAX_LOCKED_MEMORY=unlimited

保存并退出。

Elasticsearch 配置到此结束。Elasticsearch 将在本机的 9200 端口运行,我们通过在 CentOS 服务器上启用 mlockall 来禁用内存交换。重新加载 systemd,将 Elasticsearch 置为开机启动,然后启动服务。

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

等待 Eelasticsearch 启动成功,然后检查服务器上打开的端口,确保 9200 端口的状态是 LISTEN

netstat -plntu

Check elasticsearch running on port 9200

然后检查内存锁以确保启用 mlockall,并使用以下命令检查 Elasticsearch 是否正在运行。

curl -XGET 'localhost:9200/_nodes?filter_path=**.mlockall&pretty'
curl -XGET 'localhost:9200/?pretty'

会看到如下结果。

Check memory lock elasticsearch and check status

步骤 4 - 安装和配置 Kibana 和 Nginx

在这一步,我们将在 Nginx Web 服务器上安装并配置 Kibana。 Kibana 监听在 localhost 上,而 Nginx 作为 Kibana 的反向代理。

wget 下载 Kibana 5.1,然后使用 rpm 命令安装:

wget https://artifacts.elastic.co/downloads/kibana/kibana-5.1.1-x86_64.rpm
rpm -ivh kibana-5.1.1-x86_64.rpm

编辑 Kibana 配置文件。

vim /etc/kibana/kibana.yml

去掉配置文件中 server.portserver.hostelasticsearch.url 这三行的注释。

server.port: 5601
server.host: "localhost"
elasticsearch.url: "http://localhost:9200"

保存并退出。

将 Kibana 设为开机启动,并且启动 Kibana 。

sudo systemctl enable kibana
sudo systemctl start kibana

Kibana 将作为 node 应用程序运行在端口 5601 上。

netstat -plntu

Kibana running as node application on port 5601

Kibana 安装到此结束。 现在我们需要安装 Nginx 并将其配置为反向代理,以便能够从公共 IP 地址访问 Kibana。

Nginx 在 Epel 资源库中可以找到,用 yum 安装 epel-release。

yum -y install epel-release

然后安装 Nginx 和 httpd-tools 这两个包。

yum -y install nginx httpd-tools

httpd-tools 软件包包含 Web 服务器的工具,可以为 Kibana 添加 htpasswd 基础认证。

编辑 Nginx 配置文件并删除 server {} 块,这样我们可以添加一个新的虚拟主机配置。

cd /etc/nginx/
vim nginx.conf

删除 server { } 块。

Remove Server Block on Nginx configuration

保存并退出。

现在我们需要在 conf.d 目录中创建一个新的虚拟主机配置文件。 用 vim 创建新文件 kibana.conf

vim /etc/nginx/conf.d/kibana.conf

复制下面的配置。

server {
    listen 80;

    server_name elk-stack.co;

    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.kibana-user;

    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

保存并退出。

然后使用 htpasswd 命令创建一个新的基本认证文件。

sudo htpasswd -c /etc/nginx/.kibana-user admin
“输入你的密码”

测试 Nginx 配置,确保没有错误。 然后设定 Nginx 开机启动并启动 Nginx。

nginx -t
systemctl enable nginx
systemctl start nginx

Add nginx virtual host configuration for Kibana Application

步骤 5 - 安装和配置 Logstash

在此步骤中,我们将安装 Logstash,并将其配置为:从配置了 filebeat 的 logstash 客户端里集中化服务器的日志,然后过滤和转换 Syslog 数据,并将其移动到存储中心(Elasticsearch)中。

下载 Logstash 并使用 rpm 进行安装。

wget https://artifacts.elastic.co/downloads/logstash/logstash-5.1.1.rpm
rpm -ivh logstash-5.1.1.rpm

生成新的 SSL 证书文件,以便客户端可以识别 elastic 服务端。

进入 tls 目录并编辑 openssl.cnf 文件。

cd /etc/pki/tls
vim openssl.cnf

[v3_ca] 部分添加服务器标识。

[ v3_ca ]

# Server IP Address
subjectAltName = IP: 10.0.15.10

保存并退出。

使用 openssl 命令生成证书文件。

openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout /etc/pki/tls/private/logstash-forwarder.key -out /etc/pki/tls/certs/logstash-forwarder.crt

证书文件可以在 /etc/pki/tls/certs//etc/pki/tls/private/ 目录中找到。

接下来,我们会为 Logstash 创建新的配置文件。创建一个新的 filebeat-input.conf 文件来为 filebeat 配置日志源,然后创建一个 syslog-filter.conf 配置文件来处理 syslog,再创建一个 output-elasticsearch.conf 文件来定义输出日志数据到 Elasticsearch。

转到 logstash 配置目录,并在 conf.d 子目录中创建新的配置文件。

cd /etc/logstash/
vim conf.d/filebeat-input.conf

输入配置,粘贴以下配置:

input {
  beats {
    port => 5443
    ssl => true
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

保存并退出。

创建 syslog-filter.conf 文件。

vim conf.d/syslog-filter.conf

粘贴以下配置:

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

我们使用名为 grok 的过滤器插件来解析 syslog 文件。

保存并退出。

创建输出配置文件 output-elasticsearch.conf

vim conf.d/output-elasticsearch.conf

粘贴以下配置:

output {
  elasticsearch { hosts => ["localhost:9200"]
    hosts => "localhost:9200"
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}

保存并退出。

最后,将 logstash 设定为开机启动并且启动服务。

sudo systemctl enable logstash
sudo systemctl start logstash

Logstash started on port 5443 with SSL Connection

步骤 6 - 在 CentOS 客户端上安装并配置 Filebeat

Beat 作为数据发送人的角色,是一种可以安装在客户端节点上的轻量级代理,将大量数据从客户机发送到 Logstash 或 Elasticsearch 服务器。有 4 种 beat,Filebeat 用于发送“日志文件”,Metricbeat 用于发送“指标”,Packetbeat 用于发送“网络数据”,Winlogbeat 用于发送 Windows 客户端的“事件日志”。

在本教程中,我将向您展示如何安装和配置 Filebeat,通过 SSL 连接将数据日志文件传输到 Logstash 服务器。

登录到客户端1的服务器上。 然后将证书文件从 elastic 服务器复制到客户端1的服务器上。

ssh root@client1IP

使用 scp 命令拷贝证书文件。

scp root@elk-serverIP:~/logstash-forwarder.crt .
输入 elk-server 的密码

创建一个新的目录,将证书移动到这个目录中。

sudo mkdir -p /etc/pki/tls/certs/
mv ~/logstash-forwarder.crt /etc/pki/tls/certs/

接下来,在客户端 1 服务器上导入 elastic 密钥。

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

下载 Filebeat 并且用 rpm 命令安装。

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.1.1-x86_64.rpm
rpm -ivh filebeat-5.1.1-x86_64.rpm

Filebeat 已经安装好了,请转到配置目录并编辑 filebeat.yml 文件。

cd /etc/filebeat/
vim filebeat.yml

在第 21 行的路径部分,添加新的日志文件。 我们将创建两个文件,记录 ssh 活动的 /var/log/secure 文件 ,以及服务器日志 /var/log/messages

  paths:
    - /var/log/secure
    - /var/log/messages

在第 26 行添加一个新配置来定义 syslog 类型的文件。

  document-type: syslog

Filebeat 默认使用 Elasticsearch 作为输出目标。 在本教程中,我们将其更改为 Logshtash。 在 83 行和 85 行添加注释来禁用 Elasticsearch 输出。

禁用 Elasticsearch 输出:

#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
  # Array of hosts to connect to.
#  hosts: ["localhost:9200"]

现在添加新的 logstash 输出配置。 去掉 logstash 输出配置的注释,并将所有值更改为下面配置中的值。

output.logstash:
  # The Logstash hosts
  hosts: ["10.0.15.10:5443"]
  bulk_max_size: 1024
  ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
  template.name: "filebeat"
  template.path: "filebeat.template.json"
  template.overwrite: false

保存文件并退出 vim。

将 Filebeat 设定为开机启动并启动。

sudo systemctl enable filebeat
sudo systemctl start filebeat

步骤 7 - 在 Ubuntu 客户端上安装并配置 Filebeat

使用 ssh 连接到服务器。

ssh root@ubuntu-clientIP

使用 scp 命令拷贝证书文件。

scp root@elk-serverIP:~/logstash-forwarder.crt .

创建一个新的目录,将证书移动到这个目录中。

sudo mkdir -p /etc/pki/tls/certs/
mv ~/logstash-forwarder.crt /etc/pki/tls/certs/

在服务器上导入 elastic 密钥。

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

下载 Filebeat .deb 包并且使用 dpkg 命令进行安装。

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.1.1-amd64.deb
dpkg -i filebeat-5.1.1-amd64.deb

转到配置目录并编辑 filebeat.yml 文件。

cd /etc/filebeat/
vim filebeat.yml

在路径配置部分添加新的日志文件路径。

  paths:
    - /var/log/auth.log
    - /var/log/syslog

设定文档类型为 syslog

  document-type: syslog

将下列几行注释掉,禁用输出到 Elasticsearch。

#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
  # Array of hosts to connect to.
#  hosts: ["localhost:9200"]

启用 logstash 输出,去掉以下配置的注释并且按照如下所示更改值。

output.logstash:
  # The Logstash hosts
  hosts: ["10.0.15.10:5443"]
  bulk_max_size: 1024
  ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
  template.name: "filebeat"
  template.path: "filebeat.template.json"
  template.overwrite: false

保存并退出 vim。

将 Filebeat 设定为开机启动并启动。

sudo systemctl enable filebeat
sudo systemctl start filebeat

检查服务状态:

systemctl status filebeat

Filebeat is running on the client Ubuntu

步骤 8 - 测试

打开您的网络浏览器,并访问您在 Nginx 中配置的 elastic stack 域名,我的是“elk-stack.co”。 使用管理员密码登录,然后按 Enter 键登录 Kibana 仪表盘。

Login to the Kibana Dashboard with Basic Auth

创建一个新的默认索引 filebeat-*,然后点击“创建”按钮。

Create First index filebeat for Kibana

默认索引已创建。 如果 elastic stack 上有多个 beat,您可以在“星形”按钮上点击一下即可配置默认 beat。

Filebeat index as default index on Kibana Dashboard

转到 “发现” 菜单,您就可以看到 elk-client1 和 elk-client2 服务器上的所有日志文件。

Discover all Log Files from the Servers

来自 elk-client1 服务器日志中的无效 ssh 登录的 JSON 输出示例。

JSON output for Failed SSH Login

使用其他的选项,你可以使用 Kibana 仪表盘做更多的事情。

Elastic Stack 已安装在 CentOS 7 服务器上。 Filebeat 已安装在 CentOS 7 和 Ubuntu 客户端上。


via: https://www.howtoforge.com/tutorial/how-to-install-elastic-stack-on-centos-7/

作者:Muhammad Arul 译者:Flowsnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

服务器日志是一个由服务器创建并经常更新、用于抓取特定服务和应用的所有活动信息的日志文件。当你的应用或者服务出现问题时这个文件就会非常有用。从日志文件中你可以获取所有关于该问题的信息,例如基于警告或者错误信息它什么时候开始表现不正常。

LNAV(Log file Navigator)是 Linux 下一个基于控制台的高级日志文件查看器。它和其它文件查看器,例如 cat、more、tail 等,完成相同的任务,但有很多普通文件查看器没有的增强功能(尤其是它自带多种颜色和易于阅读的格式)。

它能在解压多个压缩日志文件(zip、gzip、bzip)的同时把它们合并到一起进行导航。基于消息的时间戳,lnav 能把多个日志文件合并到一个视图(Single Log Review),从而避免打开多个窗口。左边的颜色栏帮助显示消息所属的文件。

警告和错误的数量以(黄色和红色)高亮显示,因此我们能够很轻易地看到问题出现在哪里。它会自动加载新的日志行。

它按照消息时间戳排序显示所有文件的日志消息。顶部和底部的状态栏会告诉你位于哪个日志文件。如果你想按特定的模式查找,只需要在搜索弹窗中输入就会即时显示。

内建的日志消息解析器会自动从每一行中发现和提取详细信息。

当你用一个普通文件查看器打开一个日志文件时,它会用纯文本格式显示所有信息(如果用更直白的话说的话:纯白——黑底白字),这样很难去发现和理解哪里有警告或错误信息。为了克服这种情况,快速找到警告和错误信息来解决问题, lnav 是一个入手可用的更好的解决方案。

大部分常见的 Linux 日志文件都放在 /var/log/

lnav 自动检测以下日志格式

  • Common Web Access Log format(普通 web 访问日志格式)
  • CUPS page\_log
  • Syslog
  • Glog
  • VMware ESXi/vCenter 日志
  • dpkg.log
  • uwsgi
  • “Generic” – 以时间戳开始的任何消息
  • Strace
  • sudo
  • gzib & bizp

lnav 高级功能

  • 单一日志视图 - 基于消息时间戳,所有日志文件内容都会被合并到一个单一视图
  • 自动日志格式检测 - lnav 支持大部分日志格式
  • 过滤器 - 能进行基于正则表达式的过滤
  • 时间线视图
  • 适宜打印视图(Pretty-Print)
  • 使用 SQL 查询日志
  • 自动数据抽取
  • 实时操作
  • 语法高亮
  • Tab 补全
  • 当你查看相同文件集时可以自动保存和恢复会话信息。
  • Headless 模式

如何在 Linux 中安装 lnav

大部分发行版(Debian、Ubuntu、Mint、Fedora、suse、openSUSE、Arch Linux、Manjaro、Mageia 等等)默认都有 lnav 软件包,在软件包管理器的帮助下,我们可以很轻易地从发行版官方仓库中安装它。对于 CentOS/RHEL 我们需要启用 EPEL 仓库

[在 Debian/Ubuntu/LinuxMint 上安装 lnav]
$ sudo apt-get install lnav

[在 RHEL/CentOS 上安装 lnav]
$ sudo yum install lnav

[在 Fedora 上安装 lnav]
$ sudo dnf install lnav

[在 openSUSE 上安装 lnav]
$ sudo zypper install lnav

[在 Mageia 上安装 lnav]
$ sudo urpmi lnav

[在基于 Arch Linux 的系统上安装 lnav]
$ yaourt -S lnav

如果你的发行版没有 lnav 软件包,别担心,开发者提供了 .rpm.deb 安装包,因此我们可以轻易安装。确保你从 开发者 github 页面 下载最新版本的安装包。

[在 Debian/Ubuntu/LinuxMint 上安装 lnav]
$ sudo wget https://github.com/tstack/lnav/releases/download/v0.8.1/lnav_0.8.1_amd64.deb
$ sudo dpkg -i lnav_0.8.1_amd64.deb

[在 RHEL/CentOS 上安装 lnav]
$ sudo yum install https://github.com/tstack/lnav/releases/download/v0.8.1/lnav-0.8.1-1.x86_64.rpm

[在 Fedora 上安装 lnav]
$ sudo dnf install https://github.com/tstack/lnav/releases/download/v0.8.1/lnav-0.8.1-1.x86_64.rpm

[在 openSUSE 上安装 lnav]
$ sudo zypper install https://github.com/tstack/lnav/releases/download/v0.8.1/lnav-0.8.1-1.x86_64.rpm

[在 Mageia 上安装 lnav]
$ sudo rpm -ivh https://github.com/tstack/lnav/releases/download/v0.8.1/lnav-0.8.1-1.x86_64.rpm

不带参数运行 lnav

默认情况下你不带参数运行 lnav 时它会打开 syslog 文件。

# lnav

使用 lnav 查看特定日志文件

要用 lnav 查看特定的日志文件,在 lnav 命令后面添加日志文件路径。例如我们想看 /var/log/dpkg.log 日志文件。

# lnav /var/log/dpkg.log

用 lnav 查看多个日志文件

要用 lnav 查看多个日志文件,在 lnav 命令后面逐个添加日志文件路径,用一个空格隔开。例如我们想查看 /var/log/dpkg.log/var/log/kern.log 日志文件。

左边的颜色栏帮助显示消息所属的文件。另外顶部状态栏还会显示当前日志文件的名称。为了显示多个日志文件,大部分应用经常会打开多个窗口、或者在窗口中水平或竖直切分,但 lnav 使用不同的方式(它基于日期组合在同一个窗口显示多个日志文件)。

# lnav /var/log/dpkg.log /var/log/kern.log

使用 lnav 查看压缩的日志文件

要查看并同时解压被压缩的日志文件(zip、gzip、bzip),在 lnav 命令后面添加 -r 选项。

# lnav -r /var/log/Xorg.0.log.old.gz

直方图视图

首先运行 lnav 然后按 i 键切换到/出直方图视图。

查看日志解析器结果

首先运行 lnav 然后按 p 键打开显示日志解析器结果。

语法高亮

你可以搜索任何给定的字符串,它会在屏幕上高亮显示。首先运行 lnav 然后按 / 键并输入你想查找的字符串。为了测试,我搜索字符串 Default,看下面的截图。

Tab 补全

命令窗口支持大部分操作的 tab 补全。例如,在进行搜索时,你可以使用 tab 补全屏幕上显示的单词,而不需要复制粘贴。为了测试,我搜索字符串 /var/log/Xorg,看下面的截图。


via: http://www.2daygeek.com/install-and-use-advanced-log-file-viewer-navigator-lnav-in-linux/

作者:Magesh Maruthamuthu 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

一般来说,日志是任何故障排除过程中非常重要的一部分,但这些日志会随着时间增长。在这种情况下,我们需要手动执行日志清理以回收空间,这是一件繁琐的管理任务。为了解决这个问题,我们可以在 Linux 中配置 logrotate 程序,它可以自动执行日志文件的轮换、压缩、删除和用邮件发出。

我们可以配置 logrotate 程序,以便每个日志文件可以在每天、每周、每月或当它变得太大时处理。

logrotate 是如何工作的

默认情况下,logrotate 命令作为放在 /etc/cron.daily 中的 cron 任务,每天运行一次,它会帮助你设置一个策略,其中超过某个时间或大小的日志文件被轮换。

命令: /usr/sbin/logrotate

配置文件: /etc/logrotate.conf

这是 logrotate 的主配置文件。logrotate 还在 /etc/logrotate.d/ 中存储了特定服务的配置。确保下面的那行包含在 /etc/logrotate.conf 中,以读取特定服务日志配置。

include  /etc/logrotate.d`

logrotate 历史: /var/lib/logrotate.status

重要的 logrotate 选项:

compress             --> 压缩日志文件的所有非当前版本
daily,weekly,monthly --> 按指定计划轮换日志文件
delaycompress        --> 压缩所有版本,除了当前和下一个最近的
endscript            --> 标记 prerotate 或 postrotate 脚本的结束
errors "emailid"     --> 给指定邮箱发送错误通知
missingok            --> 如果日志文件丢失,不要显示错误
notifempty           --> 如果日志文件为空,则不轮换日志文件
olddir "dir"         --> 指定日志文件的旧版本放在 “dir” 中
postrotate           --> 引入一个在日志被轮换后执行的脚本
prerotate            --> 引入一个在日志被轮换前执行的脚本
rotate 'n'           --> 在轮换方案中包含日志的 n 个版本
sharedscripts        --> 对于整个日志组只运行一次脚本
size='logsize'       --> 在日志大小大于 logsize(例如 100K,4M)时轮换

配置

让我们为我们自己的示例日志文件 /tmp/sample_output.log 配置 logrotate。

第一步:在 /etc/logrotate.conf 中添加以下行。

/tmp/sample_output.log {
  size 1k
  create 700 root root
  rotate 4
  compress
}

在上面的配置文件中:

  • size 1k - logrotate 仅在文件大小等于(或大于)此大小时运行。
  • create - 轮换原始文件并创建具有指定权限、用户和组的新文件。
  • rotate - 限制日志文件轮转的数量。因此,这将只保留最近的 4 个轮转的日志文件。
  • compress - 这将压缩文件。

第二步:通常,你需要等待一天才能等到 logrotate 由 /etc/cron.daily 执行。除此之外,你可以用下面的命令在命令行中运行:

/usr/sbin/logrotate  /etc/logrotate.conf

在执行 logrotate 命令之前的输出:

[root@rhel1 tmp]# ls -l /tmp/
total 28
-rw-------. 1 root root 20000 Jan 1 05:23 sample_output.log

在执行 logrotate 之后的输出:

[root@rhel1 tmp]# ls -l /tmp
total 12
-rwx------. 1 root root 0 Jan 1 05:24 sample_output.log
-rw-------. 1 root root 599 Jan 1 05:24 sample_output.log-20170101.gz
[root@rhel1 tmp]#

这样就能确认 logrotate 成功实现了。


作者简介:

大家好!我是 Manmohan Mirkar。我很高兴见到你们!我在 10 多年前开始使用 Linux,我从来没有想过我会到今天这个地步。我的激情是帮助你们获取 Linux 知识。谢谢你们在这!


via: http://www.linuxroutes.com/configure-logrotate/

作者:Manmohan Mirkar 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

 title=

这些 DevOps 日志记录和监控工具是重塑云计算趋势的一部分 -- 在《开放云指南》中了解更多。

在云中,开源工具和应用程序使 DevOps 提高了很多效率,对于日志记录和监视解决方案尤其如此。监控云平台、应用程序和组件以及处理和分析日志,对于确保高可用性、高性能、低延迟等至关重要。事实上,RightScale 最近的云状态调查报告中说,最常见的云优化的行为中,45% 的大公司和中小型企业关注的是监控。

然而,专有的记录和监控解决方案是昂贵的。更糟的是,它们通常捆绑更昂贵的管理服务产品。

现在进入强大的开放日志和监控解决方案的新浪潮。其中一些聚焦于有针对性的任务,例如容器集群的监控和性能分析,而其他作为整体监控和警报工具包,它们能够进行多维度的数据收集和查询。

Linux 基金会最近发布 《开放云指南:当前趋势和开源项目》 Guide to the Open Cloud: Current Trends and Open Source Projects 这篇报告。这是第三份年度报告,全面地介绍了开放云计算的状态,包括为 DevOps 社区的日志记录和监控的部分。该报告现在已经可以下载,它对研究进行了汇总和分析,阐述了容器、监控等的发展趋势在如何重塑云计算。该报告提供了对当今开放云环境很重要的分类项目的描述和链接。需要特别注意的是,DevOps 已经成为云中应用交付和维护的最有效方法。

在这里的一系列帖子中,我们按照类别从指南中列出了这些项目,并提供了该类别整体发展情况的见解。下面,你将看到一些用于记录和监视的重要 DevOps 工具集合,它们所带来的影响,以及它们的 GitHub 链接,这些都是从《开放云指南》中收集而来的:

日志记录和监控

Fluentd

Fluentd 是一个用于统一日志记录层的开源数据收集器,由 Treasure Data 贡献。它将数据结构化为 JSON,以统一处理日志数据的所有方面:在多个源和目标之间收集、过滤、缓冲和输出日志。

Heapster

Heapster 是 Kubernetes 的一个容器集群监控和性能分析工具。它本身支持 Kubernetes 和 CoreOS,并且经过调整可以在 OpenShift 上运行。它还支持可插拔的存储后端:使用 Grafana 的 InfluxDB、Google Cloud Monitoring、Google Cloud Logging、Hawkular、Riemann 和 Kafka。

Logstash

Logstash 是 Elastic 的开源数据管道,用于帮助处理来自各种系统的日志和其他事件数据。它的插件可以连接到各种源和大规模流数据到中央分析系统。

Prometheus

Prometheus 是一个开源的系统监控和警报工具包,最初由 SoundCloud 构建,现在是 Linux 基金会的云计算基础项目。它适用于以机器为中心和微服务架构,并支持多维度数据收集和查询。

Weave Scope

Weave Scope 是 Weaveworks 的开源工具,用于实时监控分布式应用程序及其容器。它与 Kubernetes 和 AWS ECS 集成。

要了解更多关于开源云计算的趋势,查看顶级开源云计算项目的完整列表。现在下载 Linux 基金会的《开放云指南》报告!


via: https://www.linux.com/news/open-cloud-report/2016/5-devops-tools-logging-and-monitoring

作者:SAM DEAN 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出