生成日志系統和監控

背景:已知某后臺服務將日志存放在本地硬盤的日志文件中,該服務也支持代碼熱更新,并在完成熱更新后輸出一條日志。我們需要對服務日志進行監控,以確保文件熱更新后的錯誤能被第一時間發現。

我們提供 Python 程序模擬(https://pastebin.com/pZH8wruC,密碼pWXRFeSpwU)上述行為,該程序會不斷生成日志,并輸出到日志文件 1.log 中,日志格式參考源碼。

要求:
1、使用 Python 或者 Shell 對上述日志進行檢測,檢測方式可以是常駐進程實時檢測,也可以通過系統定時任務(需要說明如何配置)定時檢測日志;
2、當檢測到熱更新日志時(以"load file:"開頭,具體格式參考源碼),對錯誤日志(error級別)進行分類統計(分類按照日志內容進行);
3、如果熱更新后1分鐘內某一類別的錯誤日志比熱更新前1分鐘內的量級更多(增加50%),則在另一個文件 2.log 中記錄相關日志(附帶該量級超標的日志內容、熱更新前后的量級信息)。
?

//這是鏈接里面的代碼# 日志生成用例# - 程序隨機地生成 info 和 error 級別日志# - 每隔一段時間產生熱更新日志# - 模擬熱更新后出現更多的錯誤日志import osimport timeimport randomimport loggingdef init_logging():logger = logging.getLogger()logger.setLevel(logging.INFO)logger_format = logging.Formatter("[%(asctime)s][%(levelname)s][%(module)s:%(funcName)s:%(lineno)d] %(message)s")logger_console = logging.StreamHandler()logger_console.setLevel(logging.INFO)logger_console.setFormatter(logger_format)logger.addHandler(logger_console)logger_file = logging.FileHandler("1.log")logger_file.setLevel(logging.INFO)logger_file.setFormatter(logger_format)logger.addHandler(logger_file)STAGE_CONFIG = {"normal": {"duration": "70±10","info_base_prob": 0.01,"info_add_prob": 0,"error_base_prob": 0.01,"error_add_prob": 0,},"after_hotreload": {"duration": "80±20","info_base_prob": 0.1,"info_add_prob": 0.1,"error_base_prob": 0.1,"error_add_prob": 0.2,}}INFO_LOG_TEMPLATE = ["session connected","session closed","player login","player registered","player logout","buy item flow","sell item flow",]ERROR_LOG_TEMPLATE = ["function %d error occur","player login failed","incorrect password","establish connection failed","bad arguments",]INFO_HOTRELOAD_TEMPLATE = ["load file: %d.lua .......... [ok]"]def random_stage_time(duration):pos = duration.find('±')base_time = int(duration[:pos])offset_time = int(duration[pos + 1:])return base_time + (random.random() * 2 - 1) * offset_timedef random_select(l):e = random.choice(l)if e.find('%') >= 0:r = random.randint(0, 10)return e % rreturn eclass App:def __init__(self):self._stage = Noneself._stage_time = 0self._timer = 0self._init_state("normal")def _init_state(self, stage):self._stage = stageself._stage_time = random_stage_time(STAGE_CONFIG[stage]["duration"])self._timer = 0def on_tick(self, elapsed_time):self._timer += elapsed_timeif self._timer >= self._stage_time:if self._stage == "normal":logging.info(random_select(INFO_HOTRELOAD_TEMPLATE))self._init_state("after_hotreload")elif self._stage == "after_hotreload":self._init_state("normal")log_add_strength = 1 - min(1.0, (self._stage_time - self._timer) / self._stage_time)log_info_prob = STAGE_CONFIG[self._stage]["info_base_prob"] + \log_add_strength * STAGE_CONFIG[self._stage]["info_add_prob"]log_err_prob = STAGE_CONFIG[self._stage]["error_base_prob"] + \log_add_strength * STAGE_CONFIG[self._stage]["error_add_prob"]if random.random() < log_info_prob:logging.info(random_select(INFO_LOG_TEMPLATE))if random.random() < log_err_prob:logging.error(random_select(ERROR_LOG_TEMPLATE))def main():init_logging()app = App()last_time = time.time()while True:now_time = time.time()app.on_tick(now_time - last_time)last_time = now_timetime.sleep(0.01)if __name__ == "__main__":main()

解決方法:

為了使用Python來實現上述要求,我們可以編寫一個Python腳本來處理日志文件的讀取、解析、分類統計以及比較熱更新前后的錯誤日志數量。同時,我們將使用系統定時任務(如Linux下的cron)來定期運行這個Python腳本。

步驟 1: 編寫Python腳本

首先,我們需要編寫一個Python腳本來處理日志文件。這個腳本將需要能夠:

  1. 讀取日志文件。
  2. 檢測熱更新日志(以"load file:"開頭)。
  3. 提取錯誤日志并根據內容進行分類統計。
  4. 比較熱更新前后的錯誤日志數量。
  5. 記錄超標的日志內容和統計信息到另一個文件。

下面是一個簡化的Python腳本示例:

import re  
import os  
from datetime import datetime, timedelta  LOG_FILE = '/path/to/your/logfile.log'  
OUTPUT_FILE = '/path/to/2.log'  
TEMP_STATS_FILE = '/tmp/stats.tmp'  # 模擬從日志文件中讀取行(實際中應使用文件操作)  
def read_log_lines(file_path):  # 這里只是模擬,實際中應打開文件并逐行讀取  with open(file_path, 'r') as file:  return file.readlines()  # 檢測熱更新并處理日志  
def process_logs():  lines = read_log_lines(LOG_FILE)  update_time = None  before_counts = {}  after_counts = {}  # 遍歷日志行  for line in lines:  if line.startswith('load file:'):  # 檢測到熱更新,記錄時間并重置計數器  update_time = datetime.strptime(line.split(' ')[-1], '%Y-%m-%d %H:%M:%S')  before_counts = {}  after_counts = {}  elif 'ERROR' in line:  # 假設每行日志包含時間和級別  log_time = datetime.strptime(re.search(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', line).group(), '%Y-%m-%d %H:%M:%S')  error_type = re.search(r'ERROR: (.+?)(?: \[|$)', line).group(1)  if update_time and update_time - timedelta(minutes=1) <= log_time <= update_time + timedelta(minutes=1):  # 在熱更新前后1分鐘內  if log_time < update_time:  before_counts[error_type] = before_counts.get(error_type, 0) + 1  else:  after_counts[error_type] = after_counts.get(error_type, 0) + 1  # 比較并記錄結果  for type, after_count in after_counts.items():  before_count = before_counts.get(type, 0)  if after_count > before_count * 1.5:  with open(OUTPUT_FILE, 'a') as file:  file.write(f"Error type {type} increased significantly after update:\n")  file.write(f"Before: {before_count}, After: {after_count}\n")  # 這里可以添加更多邏輯來記錄具體的日志內容  # 定時任務將調用這個函數  
if __name__ == '__main__':  process_logs()

注意:上面的腳本有幾個簡化和假設的地方,比如直接讀取整個日志文件并假設時間戳和錯誤類型可以直接從日志行中提取。在實際應用中,你可能需要處理更復雜的日志格式和更大的日志文件。

步驟 2: 配置Cron定時任務

接下來,你需要在Linux系統上設置Cron定時任務來定期運行這個Python腳本。

  1. 打開終端。
  2. 輸入crontab -e命令來編輯當前用戶的Cron任務列表。
  3. 添加一個定時任務來每分鐘運行一次腳本(或者根據你的需求設置不同的頻率):
    * * * * * /usr/bin/python3 /path/to/your/script.py

    注意將/usr/bin/python3替換為你的Python解釋器的實際路徑,/path/to/your/script.py替換為你的Python腳本的實際路徑。

    保存并關閉編輯器。Cron將自動加載新的任務列表。
    現在,你的Python腳本將按照Cron任務的設置定期運行,檢測日志文件中的熱更新,并對錯誤

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44448.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44448.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab仿真 模擬調制(上)

&#xff08;內容源自詳解MATLAB&#xff0f;SIMULINK 通信系統建模與仿真 劉學勇編著第五章內容&#xff0c;有興趣的讀者請閱讀原書&#xff09; 1.幅度調制 clear all ts0.0025; %信號抽樣時間間隔 t0:ts:10-ts;%時間矢量 fs1/ts;%抽樣頻率 dffs/length(t); %fft的頻率分…

國內從事人機交互的團隊——浙江工業大學

一、背景 當我們選擇一個新的課題后&#xff0c;需要清楚的了解從事該方向的團隊都有哪些&#xff0c;這樣可以及時跟蹤和學習大牛團隊的最新進展&#xff0c;以免自己認為的good idea&#xff0c;其實早就已經研究過了。 隨著人形機器人的發展&#xff0c;機器人不僅需要在無…

人類遠未觸及自然規律的本質

我想知道上帝是如何創造這個世界的&#xff0c;對于這樣或那樣的現象我不感興趣&#xff0c;我想知道的是他的思想&#xff0c;其余的都是細枝末節。——愛因斯坦 人類對自然規律的研究已經取得了不少進展&#xff0c;但是看起來研究清楚了原理&#xff0c;其實只是發現了更深…

【Windows】實現窗口子類化(基于遠程線程注入)

目錄 前言 原理解釋 完整項目 相關文獻 文章出處鏈接&#xff1a;[https://blog.csdn.net/qq_59075481/article/details/140334106] 前言 眾所周知&#xff0c;DLL 注入有多種用途&#xff0c;如熱修補、日志記錄、子類化等。本文重點介紹使用 DLL 注入對窗口進行子類化。…

mysql中count的區別

count(1)和count(*) 從執行計劃來看&#xff0c;count(1)和count(*)的效果是一樣的當表的數據量大些時&#xff0c;對表分析之后&#xff0c;使用count(1)還要比使用count(*)用時多當數據量在1W以內時&#xff0c;count(1)會比count(*)的用時少&#xff0c;不過也差不多如果cou…

GOLLIE : ANNOTATION GUIDELINES IMPROVE ZERO-SHOT INFORMATION-EXTRACTION

文章目錄 題目摘要引言方法實驗消融 題目 Gollie&#xff1a;注釋指南改進零樣本信息提取 論文地址&#xff1a;https://arxiv.org/abs/2310.03668 摘要 大型語言模型 (LLM) 與指令調優相結合&#xff0c;在泛化到未見過的任務時取得了重大進展。然而&#xff0c;它們在信息提…

又上熱搜!曝iPhone 16將支持40W快充

ChatGPT狂飆160天&#xff0c;世界已經不是之前的樣子。 更多資源歡迎關注 7月9日晚&#xff0c;微博話題“iPhone16系列或將支持40W快充”上了熱搜榜&#xff0c;這已經是iPhone 16系列第N次上熱搜了。 據爆料&#xff0c;iPhone 16系列充電功率將提升至40W&#xff0c;并且…

Java自己實現動態數組

數組是由一組元素&#xff08;值或變量&#xff09;組成的數據結構&#xff0c;每個元素有至少一個索引或鍵來標識。 數組內的元素是連續存儲的&#xff0c;所以數組中元素的地址&#xff0c;可以通過其索引計算出來 空間占用 Java 中數組結構為 8 字節 markword 4 字節 cl…

米家立式學習燈怎么樣?書客、米家、孩視寶三款護眼大路燈巔峰PK!

米家立式學習燈怎么樣?不知從什么時候開始&#xff0c;青少年成為了近視重災區&#xff0c;主要促成近視的原因有長時間接觸電子產品、學習時的不正確姿勢、不良的燈光環境等&#xff0c;除了減少電子產品的使用以及多室外活動之外&#xff0c;剩下的就是室內孩子經常學習的光…

全球首款集成GPT-4o的智能眼鏡AirGo Vision:AI眼鏡的未來

引言 在人工智能和大模型技術迅猛發展的今天&#xff0c;AI硬件產品逐漸走入人們的生活。繼Meta Ray-Ban智能眼鏡之后&#xff0c;Solos公司在最近的香港智能眼鏡峰會上發布了全球首款集成GPT-4o的智能眼鏡AirGo Vision。本文將深入探討這款AI智能眼鏡的功能、技術特點以及其在…

侯捷C++面向對象高級編程(下)-2-non-explicit one argument constructor

1.構造函數 構造函數: Fraction(int num, int den 1) 初始化分子和分母&#xff0c;允許指定分子 num 和可選的分母 den。默認情況下&#xff0c;分母為 1。 加法運算符重載: Fraction operator(const Fraction& f) 重載了加法運算符 。這使得兩個 Fraction 對象可以通過 …

Qt 異步實現事件的定時執行 - QTimer和QThread的聯合使用

異步實現事件的定時執行 - QTimer和QThread的聯合使用 引言一、核心源碼二、其信號和槽函數簡述三、定時器及其moveToThread簡述 引言 在 Qt 中&#xff0c;如果想要定時執行某些事件或函數&#xff0c;通常會使用 QTimer 類。QTimer 允許設置一個時間間隔&#xff0c;當這個時…

echarts使用自定義圖形實現3D柱狀圖

先看下效果吧 實現思路 使用graphic創建并注冊自定義圖形。根據每組的數據值&#xff0c;得到一個對應的點&#xff0c;從點出發用canvas繪制一組圖形&#xff0c;分別為 頂部的菱形 const CubeTop echarts.graphic.extendShape({buildPath: function (ctx, shape) {const c1…

c++ primer plus 第15章友,異常和其他,15.3.8exception 類

c primer plus 第15章友&#xff0c;異常和其他,15.3.8exception 類 15.3.8exception 類 文章目錄 c primer plus 第15章友&#xff0c;異常和其他,15.3.8exception 類15.3.8exception 類1.stdexcept異常類3.空指針和 new 15.3.8exception 類 C異常的主要目的是為設計容錯程序…

NVIDIA良心給顯卡免費升級,只為挨更多的罵

起猛了&#xff0c;還真的以為 NVIDIA 良心發現了。 眾所周知&#xff0c;英偉達對于咱們普通游戲玩家向來不屑一顧。只因為游戲業務在 NVIDIA 收入中占比較少。 在最新的 40 系顯卡 RTX 4070 Ti Super 顯卡中&#xff0c;NVIDIA悄悄給它來了一次核心「升級」&#xff0c;將原…

ARM學習(29)NXP 雙coreMCU IMX1160學習----NorFlash 啟動引腳選擇

ARM學習&#xff08;28&#xff09;NXP 雙coreMCU IMX1160學習----NorFlash 啟動引腳選擇 1、多種啟動方式介紹 IMX1166 支持多組flexSPI 引腳啟動&#xff0c;FlexSPI1以及FlexSPI2&#xff0c;通過boot cfg可以切換FlexSPI得實例。 每個實例又支持多組引腳&#xff0c;總共…

Subclass-balancing Contrastive Learning for Long-tailed Recognition

Subclass-balancing Contrastive Learning for Long-tailed Recognition 核心公式解析溫度參數 τ \tau τ的作用公式5解析 核心公式解析 L S B C L ? ∑ i 1 N ( 1 ∣ M ~ i ∣ ∑ z p ∈ M ~ i log ? exp ? ( z i ? z p ? / τ 1 ) ∑ z a ∈ V ~ i exp ? ( z i ? z…

LiteOS增加執行自定義源碼

開發過程注意事項&#xff1a; 源碼工程路徑不能太長 源碼工程路徑不能有中文 一定要關閉360等殺毒軟件&#xff0c;否則編譯的打包階段會出錯 增加自定義源碼的步驟: 1.創建源碼目錄 2. 創建源文件 新建myhello目錄后&#xff0c;再此目錄下再新建源文件myhello_demo.c 3. 編…

程序員學長 | PyCaret,一個超強的 python 庫

本文來源公眾號“程序員學長”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;PyCaret&#xff0c;一個超強的 python 庫 今天給大家分享一個超強的 python 庫&#xff0c;PyCaret。 https://github.com/pycaret/pycaret 簡介 …

[論文筆記]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

引言 今天帶來又一篇RAG論文筆記&#xff1a;RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL。 檢索增強語言模型能夠更好地適應世界狀態的變化并融入長尾知識。然而&#xff0c;大多數現有方法只能從檢索語料庫中檢索到短的連續文本片段&#xff0…