日志异常检测模型


1. 首选方案:loglizer(GitHub 官方维护,直接跑)

项目地址:https://github.com/logpai/loglizer

或者直接下载我配套的资源

  • 这是日志异常检测领域的标杆级开源项目,已经维护了多年,比赛里很多高分选手都用它
  • 内置了 HDFS/Windows/Linux 等系统日志的处理流程,支持传统机器学习(随机森林、XGBoost)和深度学习模型
  • 自带完整的预处理、特征提取、训练、评估脚本,你只需要:
    1. 把你的日志数据格式改成它的标准格式
    2. 运行 python run.py 一键训练 + 预测

2. 次选方案:logdeep(轻量化,快速出结果)

项目地址:https://github.com/donglee-afar/logdeep

  • 专门针对日志异常检测的深度学习工具包,内置了 DeepLog、LogAnomaly 等经典模型
  • 优势:轻量、对电脑配置要求低,不用 GPU 也能跑,代码结构简单,改几行路径就能适配你的数据

3. 懒人方案:LogBERT(预训练模型,下载即用)

国内镜像地址:https://gitcode.com/gh_mirrors/lo/logbert

  • 基于 BERT 的日志专用预训练模型,在多个公开日志数据集上 SOTA,比赛里用它的人很多
  • 直接下载预训练权重,用几行代码加载就能跑推理,不用从头训练
  • 代码示例(直接复制就能用):
from transformers import BertForSequenceClassification, BertTokenizer
import pandas as pd

# 加载模型和分词器
model = BertForSequenceClassification.from_pretrained("./logbert")
tokenizer = BertTokenizer.from_pretrained("./logbert")

# 加载你的日志数据
df = pd.read_csv("test_logs.csv")
inputs = tokenizer(df["log_content"].tolist(), padding=True, truncation=True, return_tensors="pt")

# 预测
outputs = model(**inputs)
predictions = outputs.logits.argmax(dim=1).numpy()

# 生成提交文件
pd.DataFrame({"id": df["id"], "label": predictions}).to_csv("submission.csv", index=False)

文件 用途 是否推荐你下载
CyberChef_v11.0.0.zip 完整的离线网页版,解压后直接打开 CyberChef.html 就能用,包含所有功能,不用额外安装依赖 强烈推荐
Source code (zip) 项目源码包,需要自己构建 / 编译才能运行,适合开发者二次开发 ❌ 不推荐普通用户
Source code (tar.gz) Linux/macOS 格式的源码包,同样需要编译,Windows 用不上 ❌ 不推荐

🚀 下载后怎么用(30 秒就能搞定)

  1. 下载 CyberChef_v11.0.0.zip,解压到任意文件夹
  2. 双击打开里面的 CyberChef.html 文件(用浏览器打开即可)
  3. 直接使用,不需要安装、不需要联网、不需要配置环境

💡 额外小技巧

  • 如果你不想下载,也可以直接用官方在线版:https://gchq.github.io/CyberChef/,和离线版功能完全一样,打开网页就能用
  • 离线版适合比赛 / 无网络环境,而且处理大文件更稳定,不会被浏览器限制

使用方法

一、先搭好环境(1 分钟)

  1. 打开 PowerShell / CMD,进入你解压好的 loglizer-master 文件夹
    cd 你解压的路径\loglizer-master
    
  2. 安装依赖包(只需要一次)
    pip install -r requirements.txt

二、核心:把你的数据改成工具能识别的格式

这个工具默认用的是 HDFS 日志,你需要把你的日志数据改成下面的格式:

列名 说明
LineId 日志序号(从 0 开始)
EventId 日志事件 ID(可以先不用管,后面工具会自动生成)
EventTemplate 日志模板(工具会自动解析,不用手动写)
Content 原始日志内容(你的日志文本)
Label 标签(正常 / 异常,训练集用,测试集可以空着)

懒人转换方法:

  1. 把你的日志文件(比如 train.csvtest.csv)放到 loglizer-master\data\ 文件夹里
  2. 写一个简单的转换脚本(复制下面的代码,保存为 convert_data.py 放到 loglizer-master 里)
    import pandas as pd
    
    # 读取你的数据
    train_df = pd.read_csv("data/你的训练集文件.csv")
    test_df = pd.read_csv("data/你的测试集文件.csv")
    
    # 转换成loglizer格式
    def convert(df, is_train=True):
        new_df = pd.DataFrame()
        new_df["LineId"] = range(len(df))
        new_df["Content"] = df["你的日志内容列名"]  # 替换成你表里的日志内容列名
        if is_train:
            new_df["Label"] = df["你的标签列名"]  # 替换成你表里的标签列名(0正常/1异常)
        return new_df
    
    # 保存成工具能识别的文件
    convert(train_df).to_csv("data/train_log.csv", index=False)
    convert(test_df, is_train=False).to_csv("data/test_log.csv", index=False)

  3. 运行转换脚本:
    python convert_data.py
    

三、直接跑现成的 demo(快速出结果)

工具自带了完整的 demo 脚本,你直接改几行路径就能用:

  1. 打开 loglizer_demo.py,把里面的数据集路径改成你刚转换好的文件:
    # 原来的代码是HDFS路径,改成你的
    data_path = "./data/"
    log_file = "train_log.csv"
    test_file = "test_log.csv"
    
  2. 运行 demo 脚本:
    python loglizer_demo.py
    
  3. 脚本会自动完成:
    • 日志解析(提取模板)
    • 特征提取(词频、事件向量)
    • 模型训练(默认用随机森林 / 逻辑回归)
    • 输出预测结果和准确率

四、直接生成比赛提交文件(如果是比赛的话)

脚本跑完后,会生成预测结果,你只需要把结果转换成比赛要求的格式就行:

# 示例:把预测结果转换成比赛提交格式
predictions = model.predict(X_test)  # demo里已经有这个变量
test_df = pd.read_csv("data/test_log.csv")
submission = pd.DataFrame({
    "id": test_df["LineId"],  # 替换成比赛要求的ID列名
    "label": predictions
})
submission.to_csv("submission_log.csv", index=False)

💡 关键提分小技巧

  1. 优先用随机森林 / XGBoost 模型:在 demo 里把模型换成 XGBoost,比默认的逻辑回归准确率高很多,直接能冲到 0.85+
    from loglizer.models import XGBoost
    model = XGBoost()
    
  2. 日志解析用 Spell 算法:比默认的解析算法更稳定,能更好提取 Windows/Linux 日志模板
    from loglizer import preprocessing
    parser = preprocessing.SpellParser()
    structured_logs = parser.parse(logs_series, output_file='./data/structured_logs.csv')
    
  3. 处理类别不平衡:如果异常样本很少,在训练时给异常样本加权重,或者用 SMOTE 过采样,能大幅提升 F1 分数

可能会出现的问题:

问题1:搭建环境时,安装依赖出现问题

这个报错的核心原因是:loglizer 里的 requirements.txt 写了已经废弃的 sklearn 包名,现在 Python 不允许安装这个包了,得换成正确的 scikit-learn


🔧 第一步:修改 requirements.txt
  1. 打开 loglizer-master/requirements.txt 文件
  2. 把里面的 sklearn 改成 scikit-learn(这就是报错的根源)
  3. 保存文件

修改后的内容应该类似这样:

numpy
pandas
scikit-learn  # 原来的 sklearn 改成这个
scipy

⚡ 第二步:重新安装依赖

在 PowerShell 里执行下面的命令:

# 先更新 pip(可选,但能避免其他兼容问题)
python -m pip install --upgrade pip

# 重新安装依赖
pip install -r requirements.txt

🚀 备选方案:直接手动安装所有依赖

如果上面的方法还是报错,直接手动安装正确的包:

pip install numpy pandas scikit-learn scipy

💡 额外说明
  • sklearn 这个包已经被废弃了,现在官方包名是 scikit-learn,你之前的报错就是因为安装这个废弃包触发了保护机制。
  • 改完之后,再运行 python loglizer_demo.py 就不会报这个错了。

问题2:更新pip出现问题

现在用的是 MSYS2/Git Bash 里的 Python,这个版本是阉割版的,根本不带 pip,所以会报 No module named pip 错误。


✅ 最快解决方法:换用系统自带的 Python + PowerShell

别用这个 MSYS2 的 Python 了,直接用你 Windows 系统里的 Python:

1. 先打开「管理员 PowerShell」

  • 按下 Win 键 → 输入 PowerShell → 右键「以管理员身份运行」

2. 进入你的项目文件夹

进入你的项目文件夹

cd E:\desktop\loglizer-master

3. 先确认系统 Python 能正常用

python --version
pip --version

如果这两个命令都能输出版本号,说明没问题。

4. 直接安装依赖(跳过 pip 升级,避免踩坑)

pip install numpy pandas scikit-learn scipy

🛠️ 如果你必须用 Bash,修复 MSYS2 Python 的 pip

如果不想换终端,按下面步骤修复:

  1. 在 Bash 里输入:
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    python get-pip.py
    
  2. 装完后再试:
    python -m pip install --upgrade pip
    

💡 关键提醒

你现在的问题,本质是终端和 Python 版本不匹配

  • MSYS2/Git Bash 自带的 Python 是轻量版,默认不带 pip,而且和 Windows 系统的 Python 是两套东西
  • 用系统 Python + PowerShell 是最稳的,不会出现各种环境兼容问题,能直接跑通 loglizer

问题3:还在 Git Bash/MSYS2 里执行 PowerShell 命令

所以哪怕你设置了 Set-ExecutionPolicy,也根本不生效,因为这个命令只对 PowerShell 有效。

下面给你一套零环境折腾、直接在 CMD 里跑通的终极方案,复制粘贴就能用👇


✅ 终极方案:用 Windows 自带的「命令提示符(CMD)」

1. 打开 CMD

按下 Win 键 → 输入 cmd → 回车打开。

2. 进入项目目录

cd /d E:\desktop\loglizer-master

3. 创建并激活虚拟环境(CMD 专属命令)

# 创建虚拟环境(只做一次)
python -m venv .venv

# 激活虚拟环境(每次打开 CMD 都要做)
.venv\Scripts\activate.bat

激活成功后,命令行前面会出现 (.venv) 前缀。

4. 安装依赖并运行

pip install numpy pandas scikit-learn scipy
python loglizer_demo.py

💡 为什么这个方案不会再报错?
  • 完全不用 PowerShell,也就不存在 .ps1 脚本无法识别的问题
  • 用的是 Windows 原生 CMD,和你的 Python 环境完全兼容
  • 虚拟环境激活用的是 .bat 脚本,CMD 100% 支持

📌 关键提醒
  • 以后所有操作都在 CMD 里做,别再用 Git Bash/MSYS2 了,这是你所有报错的根源。
  • 激活虚拟环境后,你安装的依赖只会装在 .venv 文件夹里,不会影响系统环境。

问题4:如果明明就安装好了,但是就用不了

就是Python 版本不匹配的问题。你现在用的 pippython 不是同一个版本,导致 pip install 装到了 A 版本里,python 跑代码时用的却是 B 版本,自然找不到 pandas


🔍 问题根源解析
  • 你的 pip install 成功装到了 Python314 里(日志里能看到路径)
  • 但你执行 python loglizer_demo.py 时,调用的是电脑里另一个版本的 Python,这个版本里没装 pandas
  • 两个命令用的不是同一个 Python 环境,所以出现了 “装了但找不到” 的矛盾报错

✅ 一步到位的解决方法(强制绑定同一个 Python 版本)

1. 先确认当前 python 对应的完整路径

在 CMD 里执行:

where python

会输出电脑里所有 Python 的路径,比如:

C:\Users\你的用户名\AppData\Local\Programs\Python\Python314\python.exe
D:\msys64\mingw64\bin\python.exe

你要选第一个 Python314 的路径,复制下来备用。

2. 用这个完整路径,重新安装依赖

把上面复制的路径替换进去,执行:

"C:\Users\你的用户名\AppData\Local\Programs\Python\Python314\python.exe" -m pip install numpy pandas scikit-learn scipy

这样就能确保依赖装到你要用的这个 Python 版本里。

3. 再用同一个完整路径运行脚本

"C:\Users\你的用户名\AppData\Local\Programs\Python\Python314\python.exe" loglizer_demo.py

这次 pythonpip 用的是同一个版本,就不会再报 No module named 'pandas' 了。


💡 一劳永逸的方法:把 Python314 设为默认版本
  1. 按下 Win 键 → 输入「环境变量」→ 打开「编辑系统环境变量」
  2. 找到「用户变量」里的 Path,双击打开
  3. C:\Users\你的用户名\AppData\Local\Programs\Python\Python314\C:\Users\你的用户名\AppData\Local\Programs\Python\Python314\Scripts\ 移到列表最顶部
  4. 点击「确定」保存,重启 CMD
  5. 以后直接用 pythonpip 命令,默认就会调用 Python314 版本,不会再串版本了

问题5:跑起来了,但是还有报错怎么回事

终于跑起来了!现在的报错是 FileNotFoundError: No such file or directory: '../../data/BGL/BGL.log_structured.csv',说明 demo 脚本在找 自带的 BGL 数据集文件,但这个文件不在你的电脑里。


✅ 快速解决:直接用你自己的数据
  1. 把你的比赛日志数据文件(比如 train.csv)放到 loglizer-master/data/ 文件夹里
  2. 打开 loglizer_demo.py,把里面所有的 '../../data/BGL/BGL.log_structured.csv' 替换成你的数据文件名,比如 './data/你的比赛日志文件.csv'
  3. 再运行脚本:
    "C:\Users\你的用户名\AppData\Local\Programs\Python\Python314\python.exe" loglizer_demo.py
    

这后面就可以直接问AI让他给你生成符合你文件路径什么的适配的代码文件

💡 给你一份适配数据的简化版脚本

你可以直接复制下面的代码,保存为 loglizer_contest.py 放到 loglizer-master 文件夹里,替换掉原来的 demo:

import pandas as pd
from loglizer.models import RandomForest
from loglizer import preprocessing

# 1. 读取你的比赛数据
train_path = './data/你的训练集.csv'  # 替换成你的训练集文件名
test_path = './data/你的测试集.csv'    # 替换成你的测试集文件名

train_df = pd.read_csv(train_path)
test_df = pd.read_csv(test_path)

# 2. 提取特征(根据比赛数据调整列名)
# 假设你的数据有 'log_content' 列(日志文本)和 'label' 列(0/1标签)
X_train = train_df['log_content'].values
y_train = train_df['label'].values
X_test = test_df['log_content'].values

# 3. 日志解析与特征工程
parser = preprocessing.SpellParser()
X_train_parsed = parser.parse(X_train)
X_test_parsed = parser.parse(X_test)

# 4. 训练模型
model = RandomForest()
model.fit(X_train_parsed, y_train)

# 5. 预测并生成提交文件
y_pred = model.predict(X_test_parsed)
submission = pd.DataFrame({
    'id': test_df['id'],  # 替换成比赛要求的ID列名
    'label': y_pred
})
submission.to_csv('submission_log.csv', index=False)
print("✅ 预测完成,提交文件已生成:submission_log.csv")

🚀 运行这个简化脚本
cd /d E:\desktop\loglizer-master
"C:\Users\zouhuixin\AppData\Local\Programs\Python\Python314\python.exe" loglizer_contest.py

这样应该就能运行成功了

问题7:报错是因为你的训练集里没有 Content 这个列名

可以叫AI给你生成适配的

# ==============================================
# 日志异常检测 一键提分脚本(自动识别列名版)
# ==============================================
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier

# ===================== 你的文件路径(已填好)=====================
TRAIN_PATH = r"E:\desktop\data\train.csv"
TEST_PATH = r"E:\desktop\data\test.csv"
SUBMIT_PATH = r"E:\desktop_submission.csv"

# ===================== 1. 读取数据并自动识别列名 =====================
print("正在读取数据...")
train = pd.read_csv(TRAIN_PATH)
test = pd.read_csv(TEST_PATH)

# 打印列名,方便你核对
print("✅ 训练集列名:", list(train.columns))
print("✅ 测试集列名:", list(test.columns))

# 自动找日志文本列(优先匹配常见列名)
text_cols = ['log', '日志', 'content', 'Content', 'text', '日志内容', 'log_content', 'message']
label_cols = ['label', 'Label', '标签', 'result']
id_cols = ['id', 'Id', 'ID', '序号']

text_col = next((col for col in text_cols if col in train.columns), None)
label_col = next((col for col in label_cols if col in train.columns), None)
id_col = next((col for col in id_cols if col in test.columns), None)

if not text_col or not label_col or not id_col:
    print("❌ 自动识别列名失败,请手动修改下面的列名")
    print("请手动填写:")
    text_col = input("日志文本列名:")
    label_col = input("标签列名:")
    id_col = input("ID列名:")

print(f"✅ 使用列名:文本列={text_col}, 标签列={label_col}, ID列={id_col}")

# ===================== 2. 特征提取 =====================
tfidf = TfidfVectorizer(max_features=5000)
X_train = tfidf.fit_transform(train[text_col].fillna(''))
X_test = tfidf.transform(test[text_col].fillna(''))
y_train = train[label_col]

# ===================== 3. 训练模型 =====================
print("训练模型中...")
model = RandomForestClassifier(n_estimators=200, random_state=42)
model.fit(X_train, y_train)

# ===================== 4. 生成提交文件 =====================
print("生成预测结果...")
test['Label'] = model.predict(X_test)
submit = test[[id_col, 'Label']].rename(columns={id_col: 'Id'})
submit.to_csv(SUBMIT_PATH, index=False)

print("✅ 完成!提交文件已保存到:")
print(SUBMIT_PATH)
操作步骤:
  1. 把上面的代码复制到 run_log.py 文件里,覆盖原来的内容
  2. 用同样的命令运行:
    "C:\Users\zouhuixin\AppData\Local\Programs\Python\Python314\python.exe" run_log.py
    
  3. 运行时会自动识别列名,如果识别失败,会提示你手动输入列名(直接复制 CSV 里的列名就行)

为什么会报错?
  • 之前的脚本默认日志文本列叫 Content,但你的数据集里这个列的实际名字不一样(比如可能叫 log日志内容 等)
  • 这个新版本会自动匹配常见列名,匹配失败会让你手动输入,100% 能适配你的数据

结语

本文就解决日志异常检测模型安装配置部署出发,本质是对日志异常检测核心逻辑的吃透:异常检测的核心,从来不是堆砌复杂模型,而是精准捕捉数据的核心特征,解决场景的核心痛点

祝大家了解透彻日志相关知识,在数据安全的赛道上越走越远。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐