标签 日志 下的文章

Loki 扩展了 Prometheus 用于度量监测和日志聚合的模型。

Loki 是一个 Apache 2.0 许可的开源日志聚合框架,由 Grafana 实验室设计,并在不断发展的社区的巨大支持之下建立。它也是我每天为之努力的项目。在这篇文章中,我将不只是谈论 Loki 如何工作,而是提供一个实际操作的介绍,以解决实际问题。

问题:一个持久的集中式 Shell 历史记录

我喜欢我的 shell 历史,一直是 CTRL+R 的狂热用户。大约一年前,我的终端生活发生了翻天覆地的变化,我的同行 Dieter Plaetinck 向我介绍了命令行模糊查找器 fzf

突然间,在命令中搜索就从这样:

 title=

变成了这样:

 title=

虽然 fzf 极大地提高了我的生活质量,但围绕着我的 shell 历史记录,还是缺少了一些片段:

  • 终端突然关闭、电脑崩溃、死机、整盘加密密钥被遗忘等情况下会丢失 shell 历史记录。
  • 想从我的所有电脑上访问我的 shell 历史记录。

我认为我的 shell 历史记录是文件:它是一个重要的故事,我不想失去。将 Loki 与我的 shell 历史结合起来,有助于解决这些问题和更多问题。

关于 Loki

Loki 采用了开源 Prometheus 项目用于度量的直观的标签模型,并将其扩展到日志聚合的世界。这使得开发人员和运维人员能够使用相同的标签集在他们的度量和日志之间无缝切换。即使你没有使用 Prometheus,也有很多理由说明 Loki 可能很适合你的日志存储需求:

  • 低开销: Loki 不做全文日志索引;它只创建你放在日志上的标签的索引。保持小的索引大大降低了 Loki 的运维要求。我在 树莓派 上运行我的 loki-shell 项目,该项目使用 Loki 来存储 shell 历史记录,只使用了 50MB 多一点的内存。
  • *成本低:**日志内容被压缩并存储在对象存储中,如 Amazon S3、Google 云存储、Azure Blob,甚至可以直接存储在文件系统中。我们的目标是使用价格低廉且持久的存储。
  • 灵活性: Loki 以单个二进制文件的形式提供,可以直接下载并运行,也可以作为 Docker 镜像在任何容器环境中运行。在 Kubernetes 中可以用一个 Helm 海图 快速上手。如果你对日志工具的要求很高,可以看看运行在 Grafana 实验室的 生产环境。它使用开源的 JsonnetTanka 部署了同样的 Loki 镜像作为离散的构件,以实现大规模的水平扩展、高可用性、复制、读写路径的分别扩展、高度可并行的查询等。

总而言之,Loki 的方法是保留一个关于你的日志元数据的小索引(标签),并将未索引的、压缩的日志内容存储在廉价的对象存储中,以使操作更容易和更便宜。该应用程序被构建为单进程运行,并很容易演变成一个高可用的分布式系统。你可以通过并行化和查询的分片,在较大的日志工作负载上获得较高的查询性能 —— 有点像为你的日志设计的 MapReduce。

此外,这个功能是任何人都可以免费使用的。与其 Grafana 开放观测性平台一样,Grafana 实验室致力于将 Loki 打造成一个任何人都可以使用的全功能、全开放的日志聚合软件。

开始吧

我在树莓派上运行 Loki,并将我的 shell 历史记录异地存储在 S3 bucket 中。

当我按下 CTRL+R,Loki 的 LogCLI 命令行界面会发起几个批处理请求,传输至 fzf。下面是一个例子,上半部分显示的是树莓派上的 Loki 服务器日志。

 title=

准备试试?下面的指南将帮助你设置和运行 Loki,与你的 shell 历史记录集成。为了让本教程保持简洁,此设置将 Loki 本地运行在你的计算机上,并在文件系统上存储所有文件。

loki-shell 的 GitHub 版本库,你可以找到所有这一切,以及如何设置一个更复杂的安装的信息。

请注意,本教程不会改变任何围绕你的历史记录的现有行为,所以 你现有的 shell 历史记录命令和历史记录设置不会被触动。相反,这将用 Bash 中的 $PROMPT_COMMAND 和 Zsh 中的 precmd 复制命令历史记录到 Loki。在 CTRL+R 方面,它重载了 fzf 用来访问 CTRL+R 命令的函数。因此试一试是安全的,如果你觉得不喜欢它,只需按照 GitHub 版本库中的 卸载步骤 来删除所有痕迹。你的 shell 历史记录不会被触及。

第一步:安装 fzf

安装 fzf 有几种方法,但我更喜欢 Git 方法

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

对所有的问题提示说 yes

如果你已经安装了 fzf,确保你已经启用了键绑定(即,确保当你输入 CTRL+R 时,fzf 会弹出)。如果有必要的话,你可以重新运行 fzf 安装过程来启用键绑定。

第二步:安装 loki-shell

fzf 一样,loki-shell 也有一个 Git 版本库和安装脚本:

git clone --depth 1 https://github.com/slim-bean/loki-shell.git ~/.loki-shell
~/.loki-shell/install

首先,该脚本创建了 ~/.loki-shell 目录,所有的文件都将保存在该目录下(包括 Loki 数据),接下来,它将下载 Promtail、LogCLI 和 Loki 的二进制文件。

然后它会问:

Do you want to install Loki? ([y]/n)

如果你已经为 Loki-shell 运行了一个集中化的 Loki,你可以回答 n;然而,对于本教程,回答 y 或按回车键。

在本地运行 Loki 有两种方式:作为一个 Docker 镜像或作为一个单一的二进制文件(支持添加为 systemd 服务)。如果可以,我建议使用 Docker,因为我认为它稍微简化了操作,但这两者都可以工作。

使用 Docker 运行

将 Loki 作为 Docker 镜像运行:

[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) y
Error: No such object: loki-shell
Error response from daemon: No such container: loki-shell
Error: No such container: loki-shell
54843ff3392f198f5cac51a6a5071036f67842bbc23452de8c3efa392c0c2e1e

如果这是你第一次运行这个安装程序,你可以忽略错误信息。这个脚本将停止和替换运行的 Loki 容器,如果版本不匹配,你可以重新运行此脚本升级 Loki。

就是这样!Loki 现在作为一个 Docker 容器运行了。

Loki 的数据将存储在 ~/.loki-shell/data 中。

由于带着 -restart=unless-stopped 标志运行该镜像,所以它会在系统重启时重启该服务,但如果你运行 docker stop loki-shell 则会保持停止。

(如果你使用的是 Docker,你可以跳到 “Shell 集成”一节。)

以二进制文件运行

在 Linux 系统上运行二进制文件的方法有很多。这个脚本可以安装一个 systemd 服务。如果你没有 systemd,你也可以使用二进制安装:

[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) n

Run Loki with systemd? ([y]/n) n

This is as far as this script can take you
You will need to setup an auto-start for Loki
It can be run with this command: /home/username/.loki-shell/bin/loki -config.file=/home/username/.loki-shell/config/loki-binary-config.yaml

脚本会输出你需要用来运行 Loki 的命令,你可以自己设置一个 init 脚本或其他方法来自动启动它。

如果你想的话,你可以直接运行该命令,从你当前的 shell 运行 Loki。

如果你有 systemd,你可以选择让脚本安装 systemd 服务或显示出你自己运行它的命令:

Run Loki with systemd? ([y]/n) y

Installing the systemd service requires root permissions.
[y] to run these commands with sudo [n] to print out the commands and you can run them yourself. ([y]/n) n
sudo cp /home/ed/.loki-shell/config/loki-shell.service /etc/systemd/system/loki-shell.service
sudo systemctl daemon-reload
sudo systemctl enable loki-shell
sudo systemctl start loki-shell
Copy these commands and run them when the script finishes. (press enter to continue)
Shell 集成

无论你如何安装 Loki,你现在应该看到一个提示:

Enter the URL for your Loki server or press enter for default (http://localhost:4100)

如果你已经设置了一个中心化的 Loki,你应在这里输入其 URL。然而,这个演示只是使用了默认的 URL,所以你可以按回车键。

它会输出很多文本来解释添加到你的 ~.bashrc~.zshrc(或两者)的所有条目。

好了!

Finished. Restart your shell or reload config file.
   source ~/.bashrc  # bash
   source ~/.zshrc   # zsh

第三步:试试吧!

开始使用你的 shell,并使用 CTRL+R 查看你的命令。

打开多个终端窗口,在一个窗口中输入命令,在另一个窗口中输入 CTRL+R,你会看到你的命令立即可用。

另外,请注意,当你在终端之间切换并输入命令时,使用 CTRL+R 可以立即使用它们,但向上箭头的操作在终端之间不受影响。(如果你安装了 Oh My Zsh,情况可能就不一样了,因为它会自动将所有命令追加到历史记录中。)

多次按下 CTRL+R 可以在按时间排序和按相关性排序之间切换。

请注意,此配置将只显示当前主机的查询历史记录,即使你正在从多个主机向 Loki 发送 shell 数据。我认为默认情况下这是最合理的。如果你想改变这种行为,有很多地方可以调整;请参见 loki-shell 版本库了解更多。

它还安装了一个名为 hist 的别名。

alias hist="$HOME/.loki-shell/bin/logcli --addr=$LOKI_URL"

LogCLI 可以用来直接在 Loki 上查询和搜索你的历史,也允许你搜索其他主机。查看 LogCLI 的入门指南,了解更多关于查询的信息。

Loki 的日志查询语言(LogQL)提供了度量查询,可以让你做一些有趣的事情,例如,我可以看到在过去 30 天里我发出了多少次 kc 命令(我对 kubectl 的别名)。

 title=

额外增强

安装 Grafana,摆弄一下你的 shell 历史记录。

docker run -d -p 3000:3000 --name=grafana grafana/grafana

打开 Web 浏览器,访问 http://localhost:3000,使用默认的 admin/admin 用户名和密码登录。

在左边,导航到“ 配置 Configuration -> 数据源 Datasources ”,点击“ 添加数据源 Add Datasource ”按钮,然后选择 “Loki”。

对于 URL,你应该可以使用 http://localhost:4100(然而,在我的 WSL2 机器上,我必须使用计算机的实际 IP 地址)。

单击“ 保存并测试 Save and Test ”。你应该看到连接了数据源并找到了标签。

点击左边的“ 管理器 Explore ”图标,确保选择 Loki 数据源,并尝试这个查询:

{job="shell"}

如果发送 shell 命令的主机较多,可以使用“ 主机 Host ”标签将结果限制在某个主机上:

{job="shell", hostname="myhost"}.

你也可以用过滤表达式寻找特定的命令:

{job="shell"} |= "docker"

或者你可以从日志中探索度量的世界,看看你使用 shell 的频率:

rate({job="shell"}[1m])

 title=

想从一个事件中重建一个时间线?你可以通过特定的命令进行过滤,查看它的运行时间:

 title=

要想知道你还能做什么,并了解更多关于 Loki 查询语言的信息,请查看 LogQL 指南。

总结

更多的想法、故障排除和更新,请关注该 GitHub 版本库。这仍然是一项正在进行中的工作,所以请在那里报告发现的任何问题。

要了解更多关于 Loki 的信息,请查看文档、博客文章和该 GitHub 版本库,或者在 Grafana Cloud 中试用。


特别感谢我的同事 Jack Baldry 为这个想法播下的种子。我有 Loki 的知识来实现这个想法,但如果不是他的建议,我想我永远也不会做到这一点。


via: https://opensource.com/article/20/10/shell-history-loki-fzf

作者:Ed Welch 选题:lujun9972 译者:wxy 校对:wxy

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

集中日志并结构化待处理的日志数据可缓解与缺少日志相关的风险

日志记录和日志分析对于保护基础设施安全来说至关重要,尤其是当我们考虑到通用漏洞的时候。这篇文章基于我在 FOSDEM'19 上的闪电秀《Let's use centralized log collection to make incident response teams happy》,目的是提高大家对日志匮乏这种安全问题的重视,提供一种避免风险的方法,并且倡议更多的安全实践(利益声明: 我为 NXLog 工作)。

为什么要收集日志?为什么要集中日志记录?

确切的说,日志是写入磁盘的仅追加的记录序列。在实际生活中,日志可以在你尝试寻找异常的根源时帮助你调查基础设施的问题。当你有多个使用自己的标准与格式的日志的异构系统,并且想用一种可靠的方法来接收和处理它们的时候,挑战就来临了。这通常以元数据为代价的。集中日志记录解决方案需要共性,这种共性常常会去除许多开源日志记录工具所提供的丰富的元数据。

日志记录与监控匮乏的安全风险

开源 Web 应用程序安全项目 Open Web Application Security Project OWASP)是一个为业界贡献了许多杰出项目(包括许多专注于软件安全的工具)的非营利组织。OWASP 定期为应用开发人员和维护者报告最危险的安全挑战。在最新一版《10 项最严重的 Web 应用程序安全风险》中,OWASP 将日志记录和监控匮乏加入了列表中。OWASP 警告下列情况会导致日志记录、检测、监控和主动响应的匮乏:

  • 未记录重要的可审计性事件,如:登录、登录失败和高额交易。
  • 告警和错误事件未能产生、产生不足或不清晰的日志信息。
  • 日志信息仅在本地存储。
  • 对于实时或准实时的主动攻击,应用程序无法检测、处理和告警。

可以通过集中日志记录(例如,不仅将日志本地存储)和结构化日志数据以进一步分析来缓解上述情形(例如,在告警仪表盘和安全套件中)。

举例来说, 假设一个 DNS 查询会导向名为 hacked.badsite.net 的恶意网站。通过 DNS 监控,管理员监控并且主动的分析 DNS 请求与响应。DNS 监控的效果依赖于充足的日志记录与收集来发现潜在问题,同样也依赖于结构化 DNS 日志的结果来进一步分析。

2019-01-29
Time (GMT)      Source                  Destination             Protocol-Info
12:42:42.112898 SOURCE_IP               xxx.xx.xx.x             DNS     Standard query 0x1de7  A hacked.badsite.net

你可以在 NXLog 社区版 中自己尝试一下这个例子,也可以尝试其他例子和代码片段。 (再次声明:我为 NXLog 工作)

重要的一点:非结构化数据与结构化数据

花费一点时间来考虑下日志数据格式是很重要的。例如,让我们来考虑以下日志消息:

debug1: Failed password for invalid user amy from SOURCE_IP port SOURCE_PORT ssh2

这段日志包含了一个预定义的结构,例如冒号前面的元数据关键词(debug1)然而,余下的日志字段是一个未结构化的字符串(Failed password for invalid user amy from SOURCE_IP port SOURCE_PORT ssh2)。因此,即便这个消息是人类可轻松阅读的格式,但它不是一个计算机容易解析的格式。

非结构化的事件数据存在局限性,包括难以解析、搜索和分析日志。重要的元数据通常以一种自由字符串的形式作为非结构化数据字段,就像上面的例子一样。日志管理员会在他们尝试标准化/归一化日志数据与集中日志源的过程中遇到这个问题。

接下来怎么做

除了集中和结构化日志之外,确保你收集了正确的日志数据——Sysmon、PowerShell、Windows 事件日志、DNS 调试日志、ETW、内核监控、文件完整性监控、数据库日志、外部云日志等等。同样也要选用适当的工具和流程来来收集、汇总和帮助理解数据。

希望这对你从不同日志源中集中日志收集提供了一个起点:将日志发送到仪表盘、监控软件、分析软件以及像安全性资讯与事件管理(SIEM)套件等外部源。

你的集中日志策略会是怎么样?请在评论中分享你的想法。


via: https://opensource.com/article/19/2/reducing-security-risks-centralized-logging

作者:Hannah Suarez 选题:lujun9972 译者:leommxj 校对:wxy

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

这个 Python 模块可以以多种格式收集网站使用日志并输出良好结构化数据以进行分析。

是否想知道有多少访问者访问过你的网站?或哪个页面、文章或下载最受欢迎?如果你是自托管的博客或网站,那么无论你使用的是 Apache、Nginx 还是 Microsoft IIS(是的,没错),lars都可以为你提供帮助。

Lars 是 Python 写的 Web 服务器日志工具包。这意味着你可以使用 Python 通过简单的代码来回溯(或实时)解析日志,并对数据做任何你想做的事:将它存储在数据库中、另存为 CSV 文件,或者立即使用 Python 进行更多分析。

Lars 是 Dave Jones 写的另一个隐藏的宝石。我最初是在本地 Python 用户组中看到 Dave 演示 lars。几年后,我们开始在 piwheels 项目中使用它来读取 Apache 日志并将行插入到我们的 Postgres 数据库中。当树莓派用户从 piwheels.org下载 Python 包时,我们会记录文件名、时间戳、系统架构(Arm 版本)、发行版名称/版本,Python 版本等。由于它是一个关系数据库,因此我们可以将这些结果加入其他表中以获得有关文件的更多上下文信息。

你可以使用以下方法安装lars:

$ pip install lars

在某些系统上,正确的方式是 sudo pip3 install lars

首先,找到一个 Web 访问日志并制作一个副本。你需要将日志文件下载到计算机上进行操作。我在示例中使用的是 Apache 日志,但是经过一些小(且直观)的更改,你可以使用 Nginx 或 IIS。在典型的 Web 服务器上,你会在 /var/log/apache2/ 中找到 Apache 日志,通常是 access.logssl_access.log(对于 HTTPS)或 gzip 压缩后的轮转日志文件,如 access-20200101.gz 或者 ssl_access-20200101.gz

首先,日志是什么样的?

81.174.152.222 - - [30/Jun/2020:23:38:03 +0000] "GET / HTTP/1.1" 200 6763 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0"

这是一个显示了请求源 IP 地址、时间戳、请求文件路径(在本例中是主页 /)、HTTP 状态代码,用户代理(Ubuntu 上的 Firefox)等的请求。

你的日志文件将充满这样的条目,不仅是每个打开的页面,还包括返回的每个文件和资源:每个 CSS 样式表、JavaScript 文件和图像,每个 404 请求、每个重定向、每个爬虫。要从日志中获取有意义的数据,你需要对条目进行解析、过滤和排序。这就是 Lars 的用处。本示例将打开一个日志文件并打印每一行的内容:

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            print(row)

它会为每条日志显示如下结果:

Row(remote_host=IPv4Address('81.174.152.222'), ident=None, remote_user=None, time=DateTime(2020, 6, 30, 23, 38, 3), request=Request(method='GET', url=Url(scheme='', netloc='', path_str='/', params='', query_str='', fragment=''), protocol='HTTP/1.1'), status=200, size=6763)

它解析了日志条目,并将数据放入结构化格式中。该条目已成为具有与条目数据相关属性的 命名元组 namedtuple ,因此,例如,你可以使用 row.status 访问状态代码,并使用 row.request.url.path_str 访问路径:

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            print(f'hit {row.request.url.path_str} with status code {row.status}')

如果你只想显示 404 请求,可以执行以下操作:

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            if row.status == 404:
                print(row.request.url.path_str)

你可能要对这些数据去重,并打印独立的 404 页面数量:

s = set()
with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            if row.status == 404:
                s.add(row.request.url.path_str)
print(len(s))

我和 Dave 一直在努力扩展 piwheel 的日志记录器,使其包含网页点击量、软件包搜索等内容,归功于 lars,这些并不难。它不会告诉我们有关用户的任何答案。我们仍然需要进行数据分析,但它去掉了复杂不便的文件格式,并以我们可以利用的方式将它放入我们的数据库。

查阅 lars 的文档,以了解如何读取 Apache、Nginx 和 IIS 日志,并了解你还可以使用它做什么。再次感谢 Dave 提供的出色工具!

最初发布在 Ben Nuttall 的 Tooling Blog 中,并获许重新发布。


via: https://opensource.com/article/20/7/python-lars

作者:Ben Nuttall 选题:lujun9972 译者:geekpi 校对:wxy

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

日志滚动 log rotation 在 Linux 系统上是再常见不过的一个功能了,它为系统监控和故障排查保留必要的日志内容,同时又防止过多的日志造成单个日志文件太大。

日志滚动的过程是这样的:在一组日志文件之中,编号最大的(最旧的)一个日志文件会被删除,其余的日志文件编号则依次增大并取代较旧的日志文件,而较新的文件则取代它作为当前的日志文件。这一个过程很容易就可以实现自动化,在细节上还能按需作出微调。

使用 logrotate 命令可以手动执行日志滚动的操作。本文将要介绍的就是手动进行日志滚动的方法,以及预期产生的结果。

文中出现的示例适用于 Ubuntu 等 Linux 系统,对于其它类型的系统,日志文件和配置文件可能会有所不同,但日志滚动的过程是大同小异的。

为什么需要滚动日志

一般情况下,无需手动旋转日志文件。Linux 系统会每隔一天(或间隔更长的时间)或根据日志文件的大小自动进行一次日志滚动。如果你需要滚动日志以释放存储空间,又或者将某一部分日志从当前的活动中分割出来,这很容易做到,具体要取决于文件滚动规则。

一点背景介绍

在 Linux 系统安装完成后就已经有很多日志文件被纳入到日志滚动的范围内了。另外,一些应用程序在安装时也会为自己产生的日志文件设置滚动规则。一般来说,日志滚动的配置文件会放置在 /etc/logrotate.d。如果你想了解日志滚动的详细实现,可以参考这篇以前的文章

在日志滚动的过程中,活动日志会以一个新名称命名,例如 log.1,之前被命名为 log.1 的文件则会被重命名为 log.2,依此类推。在这一组文件中,最旧的日志文件(假如名为 log.7)会从系统中删除。日志滚动时文件的命名方式、保留日志文件的数量等参数是由 /etc/logrotate.d 目录中的配置文件决定的,因此你可能会看到有些日志文件只保留少数几次滚动,而有些日志文件的滚动次数会到 7 次或更多。

例如 syslog 在经过日志滚动之后可能会如下所示(注意,行尾的注释部分只是说明滚动过程是如何对文件名产生影响的):

$ ls -l /var/log/syslog*
-rw-r----- 1 syslog adm  128674 Mar 10 08:00 /var/log/syslog      <== 新文件
-rw-r----- 1 syslog adm 2405968 Mar  9 16:09 /var/log/syslog.1    <== 之前的 syslog
-rw-r----- 1 syslog adm  206451 Mar  9 00:00 /var/log/syslog.2.gz <== 之前的 syslog.1
-rw-r----- 1 syslog adm  216852 Mar  8 00:00 /var/log/syslog.3.gz <== 之前的 syslog.2.gz
-rw-r----- 1 syslog adm  212889 Mar  7 00:00 /var/log/syslog.4.gz <== 之前的 syslog.3.gz
-rw-r----- 1 syslog adm  219106 Mar  6 00:00 /var/log/syslog.5.gz <== 之前的 syslog.4.gz
-rw-r----- 1 syslog adm  218596 Mar  5 00:00 /var/log/syslog.6.gz <== 之前的 syslog.5.gz
-rw-r----- 1 syslog adm  211074 Mar  4 00:00 /var/log/syslog.7.gz <== 之前的 syslog.6.gz

你可能会发现,除了当前活动的日志和最新一次滚动的日志文件之外,其余的文件都已经被压缩以节省存储空间。这样设计的原因是大部分系统管理员都只需要查阅最新的日志文件,其余的日志文件压缩起来,需要的时候可以解压查阅,这是一个很好的折中方案。

手动日志滚动

你可以这样执行 logrotate 命令进行手动日志滚动:

$ sudo logrotate -f /etc/logrotate.d/rsyslog

值得一提的是,logrotate 命令使用 /etc/logrotate.d/rsyslog 这个配置文件,并通过了 -f 参数实行“强制滚动”。因此,整个过程将会是:

  • 删除 syslog.7.gz
  • 将原来的 syslog.6.gz 命名为 syslog.7.gz
  • 将原来的 syslog.5.gz 命名为 syslog.6.gz
  • 将原来的 syslog.4.gz 命名为 syslog.5.gz
  • 将原来的 syslog.3.gz 命名为 syslog.4.gz
  • 将原来的 syslog.2.gz 命名为 syslog.3.gz
  • 将原来的 syslog.1.gz 命名为 syslog.2.gz
  • 但新的 syslog 文件不一定必须创建。

你可以按照下面的几条命令执行操作,以确保文件的属主和权限正确:

$ sudo touch /var/log/syslog
$ sudo chown syslog:adm /var/log/syslog
$ sudo chmod 640 /var/log/syslog

你也可以把以下这一行内容添加到 /etc/logrotate.d/rsyslog 当中,由 logrotate 来帮你完成上面三条命令的操作:

create 0640 syslog adm

整个配置文件的内容是这样的:

/var/log/syslog
{
rotate 7
daily
missingok
notifempty
create 0640 syslog adm           <==
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}

下面是手动滚动记录用户登录信息的 wtmp 日志的示例。由于 /etc/logrotate.d/wtmp 中有 rotate 2 的配置,因此系统中只保留了两份 wtmp 日志文件。

滚动前:

$ ls -l wtmp*
-rw-r----- 1 root utmp  1152 Mar 12 11:49 wtmp
-rw-r----- 1 root utmp   768 Mar 11 17:04 wtmp.1

执行滚动命令:

$ sudo logrotate -f /etc/logrotate.d/wtmp

滚动后:

$ ls -l /var/log/wtmp*
-rw-r----- 1 root utmp     0 Mar 12 11:52 /var/log/wtmp
-rw-r----- 1 root utmp  1152 Mar 12 11:49 /var/log/wtmp.1
-rw-r----- 1 root adm  99726 Feb 21 07:46 /var/log/wtmp.report

需要知道的是,无论发生的日志滚动是自动滚动还是手动滚动,最近一次的滚动时间都会记录在 logrorate 的状态文件中。

$ grep wtmp /var/lib/logrotate/status
"/var/log/wtmp" 2020-3-12-11:52:57

via: https://www.networkworld.com/article/3531969/manually-rotating-log-files-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:HankChow 校对:wxy

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

Rsyslog 是一个自由开源的日志记录程序,在 CentOS 8 和 RHEL 8 系统上默认可用。它提供了一种从客户端节点到单个中央服务器的“集中日志”的简单有效的方法。日志集中化有两个好处。首先,它简化了日志查看,因为系统管理员可以在一个中心节点查看远程服务器的所有日志,而无需登录每个客户端系统来检查日志。如果需要监视多台服务器,这将非常有用,其次,如果远程客户端崩溃,你不用担心丢失日志,因为所有日志都将保存在中心的 Rsyslog 服务器上。rsyslog 取代了仅支持 UDP 协议的 syslog。它以优异的功能扩展了基本的 syslog 协议,例如在传输日志时支持 UDP 和 TCP 协议,增强的过滤功能以及灵活的配置选项。让我们来探讨如何在 CentOS 8 / RHEL 8 系统中配置 Rsyslog 服务器。

configure-rsyslog-centos8-rhel8

预先条件

我们将搭建以下实验环境来测试集中式日志记录过程:

  • Rsyslog 服务器 CentOS 8 Minimal IP 地址: 10.128.0.47
  • 客户端系统 RHEL 8 Minimal IP 地址: 10.128.0.48

通过上面的设置,我们将演示如何设置 Rsyslog 服务器,然后配置客户端系统以将日志发送到 Rsyslog 服务器进行监视。

让我们开始!

在 CentOS 8 上配置 Rsyslog 服务器

默认情况下,Rsyslog 已安装在 CentOS 8 / RHEL 8 服务器上。要验证 Rsyslog 的状态,请通过 SSH 登录并运行以下命令:

$ systemctl status rsyslog

示例输出:

rsyslog-service-status-centos8

如果由于某种原因 Rsyslog 不存在,那么可以使用以下命令进行安装:

$ sudo yum install rsyslog

接下来,你需要修改 Rsyslog 配置文件中的一些设置。打开配置文件:

$ sudo vim /etc/rsyslog.conf

滚动并取消注释下面的行,以允许通过 UDP 协议接收日志:

module(load="imudp") # needs to be done just once
input(type="imudp" port="514")

rsyslog-conf-centos8-rhel8

同样,如果你希望启用 TCP rsyslog 接收,请取消注释下面的行:

module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")

rsyslog-conf-tcp-centos8-rhel8

保存并退出配置文件。

要从客户端系统接收日志,我们需要在防火墙上打开 Rsyslog 默认端口 514。为此,请运行:

# sudo firewall-cmd  --add-port=514/tcp  --zone=public  --permanent

接下来,重新加载防火墙保存更改:

# sudo firewall-cmd --reload

示例输出:

firewall-ports-rsyslog-centos8

接下来,重启 Rsyslog 服务器:

$ sudo systemctl restart rsyslog

要在启动时运行 Rsyslog,运行以下命令:

$ sudo systemctl enable rsyslog

要确认 Rsyslog 服务器正在监听 514 端口,请使用 netstat 命令,如下所示:

$ sudo netstat -pnltu

示例输出:

netstat-rsyslog-port-centos8

完美!我们已经成功配置了 Rsyslog 服务器来从客户端系统接收日志。

要实时查看日志消息,请运行以下命令:

$ tail -f /var/log/messages

现在开始配置客户端系统。

在 RHEL 8 上配置客户端系统

与 Rsyslog 服务器一样,登录并通过以下命令检查 rsyslog 守护进程是否正在运行:

$ sudo systemctl status rsyslog

示例输出:

client-rsyslog-service-rhel8

接下来,打开 rsyslog 配置文件:

$ sudo vim /etc/rsyslog.conf

在文件末尾,添加以下行:

*.* @10.128.0.47:514           # Use @ for UDP protocol
*.* @@10.128.0.47:514          # Use @@ for TCP protocol

保存并退出配置文件。就像 Rsyslog 服务器一样,打开 514 端口,这是防火墙上的默认 Rsyslog 端口:

$ sudo firewall-cmd  --add-port=514/tcp  --zone=public  --permanent

接下来,重新加载防火墙以保存更改:

$ sudo firewall-cmd --reload

接下来,重启 rsyslog 服务:

$ sudo systemctl restart rsyslog

要在启动时运行 Rsyslog,请运行以下命令:

$ sudo systemctl enable rsyslog

测试日志记录操作

已经成功安装并配置 Rsyslog 服务器和客户端后,就该验证你的配置是否按预期运行了。

在客户端系统上,运行以下命令:

# logger "Hello guys! This is our first log"

现在进入 Rsyslog 服务器并运行以下命令来实时查看日志消息:

# tail -f /var/log/messages

客户端系统上命令运行的输出显示在了 Rsyslog 服务器的日志中,这意味着 Rsyslog 服务器正在接收来自客户端系统的日志:

centralize-logs-rsyslogs-centos8

就是这些了!我们成功设置了 Rsyslog 服务器来接收来自客户端系统的日志信息。


via: https://www.linuxtechi.com/configure-rsyslog-server-centos-8-rhel-8/

作者:James Kiarie 选题:lujun9972 译者:geekpi 校对:wxy

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

磁盘使用率 监控工具能够在达到给定阈值时提醒我们。但它们无法自行解决 磁盘使用率 问题。需要手动干预才能解决该问题。

如果你想完全自动化此类操作,你会做什么。是的,可以使用 bash 脚本来完成。

该脚本可防止来自 监控工具 的警报,因为我们会在填满磁盘空间之前删除旧的日志文件。

我们过去做了很多 shell 脚本。如果要查看,请进入下面的链接。

我在本文中添加了两个 bash 脚本,它们有助于清除旧日志。

1)在 Linux 中删除早于 “X” 天的文件夹的 Bash 脚本

我们有一个名为 /var/log/app/ 的文件夹,其中包含 15 天的日志,我们将删除早于 10 天的文件夹。

$ ls -lh /var/log/app/

drwxrw-rw- 3 root root  24K Oct  1 23:52 app_log.01
drwxrw-rw- 3 root root  24K Oct  2 23:52 app_log.02
drwxrw-rw- 3 root root  24K Oct  3 23:52 app_log.03
drwxrw-rw- 3 root root  24K Oct  4 23:52 app_log.04
drwxrw-rw- 3 root root  24K Oct  5 23:52 app_log.05
drwxrw-rw- 3 root root  24K Oct  6 23:54 app_log.06
drwxrw-rw- 3 root root  24K Oct  7 23:53 app_log.07
drwxrw-rw- 3 root root  24K Oct  8 23:51 app_log.08
drwxrw-rw- 3 root root  24K Oct  9 23:52 app_log.09
drwxrw-rw- 3 root root  24K Oct 10 23:52 app_log.10
drwxrw-rw- 3 root root  24K Oct 11 23:52 app_log.11
drwxrw-rw- 3 root root  24K Oct 12 23:52 app_log.12
drwxrw-rw- 3 root root  24K Oct 13 23:52 app_log.13
drwxrw-rw- 3 root root  24K Oct 14 23:52 app_log.14
drwxrw-rw- 3 root root  24K Oct 15 23:52 app_log.15

该脚本将删除早于 10 天的文件夹,并通过邮件发送文件夹列表。

你可以根据需要修改 -mtime X 的值。另外,请替换你的电子邮箱,而不是用我们的。

# /opt/script/delete-old-folders.sh

#!/bin/bash
prev_count=0
fpath=/var/log/app/app_log.*
find $fpath -type d -mtime +10  -exec ls -ltrh {} \; > /tmp/folder.out
find $fpath -type d -mtime +10  -exec rm -rf {} \;
count=$(cat /tmp/folder.out | wc -l)
if [ "$prev_count" -lt "$count" ] ; then
MESSAGE="/tmp/file1.out"
TO="[email protected]"
echo "Application log folders are deleted older than 15 days" >> $MESSAGE
echo "+----------------------------------------------------+" >> $MESSAGE
echo "" >> $MESSAGE
cat /tmp/folder.out | awk '{print $6,$7,$9}' >> $MESSAGE
echo "" >> $MESSAGE
SUBJECT="WARNING: Apache log files are deleted older than 15 days $(date)"
mail -s "$SUBJECT" "$TO" < $MESSAGE
rm $MESSAGE /tmp/folder.out
fi

delete-old-folders.sh 设置可执行权限。

# chmod +x /opt/script/delete-old-folders.sh

最后添加一个 cronjob 自动化此任务。它于每天早上 7 点运行。

# crontab -e

0 7 * * * /bin/bash /opt/script/delete-old-folders.sh

你将看到类似下面的输出。

Application log folders are deleted  older than 20 days
+--------------------------------------------------------+
Oct 11 /var/log/app/app_log.11
Oct 12 /var/log/app/app_log.12
Oct 13 /var/log/app/app_log.13
Oct 14 /var/log/app/app_log.14
Oct 15 /var/log/app/app_log.15

2)在 Linux 中删除早于 “X” 天的文件的 Bash 脚本

我们有一个名为 /var/log/apache/ 的文件夹,其中包含15天的日志,我们将删除 10 天前的文件。

以下文章与该主题相关,因此你可能有兴趣阅读。

# ls -lh /var/log/apache/

-rw-rw-rw- 3 root root  24K Oct  1 23:52 2daygeek_access.01
-rw-rw-rw- 3 root root  24K Oct  2 23:52 2daygeek_access.02
-rw-rw-rw- 3 root root  24K Oct  3 23:52 2daygeek_access.03
-rw-rw-rw- 3 root root  24K Oct  4 23:52 2daygeek_access.04
-rw-rw-rw- 3 root root  24K Oct  5 23:52 2daygeek_access.05
-rw-rw-rw- 3 root root  24K Oct  6 23:54 2daygeek_access.06
-rw-rw-rw- 3 root root  24K Oct  7 23:53 2daygeek_access.07
-rw-rw-rw- 3 root root  24K Oct  8 23:51 2daygeek_access.08
-rw-rw-rw- 3 root root  24K Oct  9 23:52 2daygeek_access.09
-rw-rw-rw- 3 root root  24K Oct 10 23:52 2daygeek_access.10
-rw-rw-rw- 3 root root  24K Oct 11 23:52 2daygeek_access.11
-rw-rw-rw- 3 root root  24K Oct 12 23:52 2daygeek_access.12
-rw-rw-rw- 3 root root  24K Oct 13 23:52 2daygeek_access.13
-rw-rw-rw- 3 root root  24K Oct 14 23:52 2daygeek_access.14
-rw-rw-rw- 3 root root  24K Oct 15 23:52 2daygeek_access.15

该脚本将删除 10 天前的文件并通过邮件发送文件夹列表。

你可以根据需要修改 -mtime X 的值。另外,请替换你的电子邮箱,而不是用我们的。

# /opt/script/delete-old-files.sh

#!/bin/bash
prev_count=0
fpath=/var/log/apache/2daygeek_access.*
find $fpath -type f -mtime +15  -exec ls -ltrd {} \; > /tmp/file.out
find $fpath -type f -mtime +15  -exec rm -rf {} \;
count=$(cat /tmp/file.out | wc -l)
if [ "$prev_count" -lt "$count" ] ; then
MESSAGE="/tmp/file1.out"
TO="[email protected]"
echo "Apache Access log files are deleted older than 20 days"  >> $MESSAGE
echo "+--------------------------------------------- +" >> $MESSAGE
echo "" >> $MESSAGE
cat /tmp/file.out | awk '{print $6,$7,$9}' >> $MESSAGE
echo "" >> $MESSAGE
SUBJECT="WARNING: Apache log folders are deleted older than 15 days $(date)"
mail -s "$SUBJECT" "$TO" < $MESSAGE
rm $MESSAGE /tmp/file.out
fi

delete-old-files.sh 设置可执行权限。

# chmod +x /opt/script/delete-old-files.sh

最后添加一个 cronjob 自动化此任务。它于每天早上 7 点运行。

# crontab -e

0 7 * * * /bin/bash /opt/script/delete-old-folders.sh

你将看到类似下面的输出。

Apache Access log files are deleted older than 20 days
+--------------------------------------------------------+
Oct 11 /var/log/apache/2daygeek_access.11
Oct 12 /var/log/apache/2daygeek_access.12
Oct 13 /var/log/apache/2daygeek_access.13
Oct 14 /var/log/apache/2daygeek_access.14
Oct 15 /var/log/apache/2daygeek_access.15

via: https://www.2daygeek.com/bash-script-to-delete-files-folders-older-than-x-days-in-linux/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:geekpi 校对:wxy

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