C——生成log文件

本文介绍如何使用C++编写代码,通过定义宏`#define_CRT_SECURE_NO_WARNINGS`,包含必要的头文件,并实现一个日志记录函数`writelog`,将当前时间戳与指定消息写入日志文件。此外,展示了如何在主函数中调用此函数,并输出简单的问候信息。
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void writelog(const char *log)
{
    time_t tDate;
    struct tm *eventTime;
    time(&tDate);
    eventTime = localtime(&tDate);
    int iYear = eventTime->tm_year + 1900;
    int iMon = eventTime->tm_mon + 1;
    int iDay = eventTime->tm_mday;
    int iHour = eventTime->tm_hour;
    int iMin = eventTime->tm_min;
    int iSec = eventTime->tm_sec;
    char sDate[16];
    sprintf(sDate, "%04d-%02d-%02d", iYear, iMon, iDay);
    char sTime[16];
    sprintf(sTime, "%02d:%02d:%02d", iHour, iMin, iSec);
    char s[1024];
    sprintf(s, "%s %s %s\n", sDate, sTime, log);
    FILE *fd = fopen("my.log", "a+");
    fputs(s, fd);
    fclose(fd);
}


void main()
{

    writelog("begin ");
    printf("hello ,michael!");
    writelog("end");
    return;

}
你的想法非常合理且专业! > ✅ **“只在【执行同步】时生成日志文件”** 比每次启动都创建日志更清晰、更有针对性,也避免了大量无用日志堆积。 --- ## ✅ 最佳实践:按需生成日志文件(仅在“执行模式”下写 `.log`) 我们可以将日志系统的初始化从 UI 启动时 **推迟到真正执行同步任务时**,并做到: | 目标 | 实现方式 | |------|----------| | ✅ 只有点击【执行同步】才生成 `sync_*.log` | 在 `run_sync(dry_run=False)` 中动态添加 `FileHandler` | | ✅ 预览模式不写文件 | 不安装 `FileHandler` | | ✅ 日志仍实时显示在 UI 上(无论预览 or 执行) | 保留全局的 `StreamHandler(self.LogStream(...))` | | ✅ 每次执行生成独立日志文件 | 使用时间戳命名 | --- ## ✅ 修改方案 ### 步骤1:修改 `_setup_logging_redirect()` —— 仅转发到 UI ```python def _setup_logging_redirect(self): """仅将 channel.* 日志转发到 UI,不写文件""" class QtStreamHandler(logging.Handler): def __init__(self, emitter): super().__init__() self.emitter = emitter self.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) def emit(self, record): try: msg = self.format(record) if msg.strip(): self.emitter.log_signal.emit(msg.strip()) except Exception: self.handleError(record) logger = logging.getLogger("channel") logger.setLevel(logging.INFO) if logger.hasHandlers(): logger.handlers.clear() handler = QtStreamHandler(self.log_emitter) logger.addHandler(handler) logger.propagate = False ``` 📌 这个阶段只负责把日志“显示在界面上”,**不涉及任何文件操作** --- ### 步骤2:在 `run_sync` 中判断是否为“执行模式”,决定是否写入文件 #### 修改 `run_sync` 方法: ```python def run_sync(self, dry_run=False): self.log(f"🔄 开始同步... ({'预览模式' if dry_run else '执行模式'})") # ...(之前的代码:清理、解析 Excel 等)... try: sync = CLMRangeSynchronizer( manifest_path=str(manifest_file), c_file_paths=c_files, backup=True ) # ========== 关键:只有执行模式才启用文件日志 ========== file_handler = None if not dry_run: import logging from pathlib import Path from datetime import datetime PROJECT_ROOT = Path(__file__).parent.resolve() LOG_DIR = PROJECT_ROOT / "output" / "log" LOG_DIR.mkdir(parents=True, exist_ok=True) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") log_file = LOG_DIR / f"sync_{timestamp}.log" # 创建 FileHandler file_handler = logging.FileHandler(log_file, encoding='utf-8') file_handler.setFormatter( logging.Formatter('%(asctime)s [%(levelname)s] %(message)s') ) # 添加到 logger target_logger = logging.getLogger("channel") target_logger.addHandler(file_handler) self.log(f"📄 日志文件已创建: {log_file}") # ========== 执行同步 ========== result = sync.run(dry_run=dry_run) # ========== 执行完毕后移除 FileHandler(防止重复写入)========== if file_handler: file_handler.close() logging.getLogger("channel").removeHandler(file_handler) # ========== 输出最终结果 ========== if dry_run: self.log("🔍 发现需要更新的内容,确认无误后可点击【执行同步】") else: self.log(f"✅ 同步成功!已更新 {len(c_files)} 个 C 文件") self.log(f"📁 备份已保存为 *.bak") except Exception as e: self.log(f"❌ 同步失败: {str(e)}", error=True) raise ``` --- ## ✅ 效果说明 | 场景 | 是否生成 `.log` 文件 | 原因 | |------|------------------|------| | 点击【预览同步】 | ❌ 不生成 | `dry_run=True`,跳过 `FileHandler` 安装 | | 点击【执行同步】 | ✅ 生成文件(如 `sync_20251015_142001.log`) | 动态添加 `FileHandler` | | 多次执行同步 | ✅ 每次一个独立文件 | 时间戳不同 | | 日志显示 | ✅ 始终显示在 UI | `QtStreamHandler` 一直存在 | --- ## ✅ 示例输出的日志文件内容(`sync_20251015_142001.log`) ``` 2025-10-15 14:20:01 [INFO] 开始同步 CLM RANGE 定义... 2025-10-15 14:20:01 [INFO] 已加载 7 个有效 RANGE 宏 2025-10-15 14:20:01 [INFO] 创建新数组: channel_ranges_2g_20m 2025-10-15 14:20:01 [INFO] 将添加: RANGE_2G_20M_11_11 → {11, 11} 到 channel_ranges_2g_20m ... 2025-10-15 14:20:02 [INFO] 已备份 → input\wlc_clm_data_6726b0.c.bak 2025-10-15 14:20:02 [INFO] 已保存: input\wlc_clm_data_6726b0.c 2025-10-15 14:20:02 [INFO] ✅ 同步完成:已成功更新 C 文件 ``` --- ## ✅ 优势总结 | 优势 | 说明 | |------|------| | 🧼 干净整洁 | 不会因预览产生一堆无效日志文件 | | 📁 可追溯 | 每一次真实变更都有独立记录,便于审计 | | ⚡ 高效安全 | `FileHandler` 临时添加 → 使用完立即 `close()` 和 `removeHandler()`,防止资源泄漏或并发冲突 | | 🔍 易调试 | 出问题时只需看最近的 `sync_*.log` 即可复现操作 | --- ## ✅ 补充建议:让用户知道日志文件位置 你可以在执行完成后加一行提示: ```python if not dry_run: self.log(f"📎 日志已保存至: output\\log\\sync_{timestamp}.log") ``` 或者做一个按钮:“打开日志目录”: ```python def open_log_dir(self): import subprocess log_dir = Path(__file__).parent / "output" / "log" subprocess.run(["explorer", str(log_dir)]) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值