You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Boost Log初始化时为日志文件添加表头以支持Pandas分析

如何在Boost Log初始化时添加唯一日志表头以支持Pandas分析

需要在日志文件初始化时添加唯一表头,用于描述日志数据格式,方便后续使用Python Pandas进行事后分析。期望的表头及日志示例如下:

YYYYMMDDHHMMSS.MS,TYPE,SIMULATION_TIME,PLATFORM_ID,LATITUDE,LONGITUDE,ELEVATION
20231008091747.442690,[info],0,drone[0],21.281,-157.796,41.7117
20231008091747.448856,[info],0,drone[2],21.2576,-157.799,6.23664
20231008091747.448907,[info],0,drone[3],21.2576,-157.799,6.23664
20231008091747.453667,[info],0,server,21.3,-157.8,196.413
20231008091747.454533,[info],0.033,drone[0],21.281,-157.796,41.6859
20231008091747.454550,[info],0.033,drone[2],21.2576,-157.799,6.24225

当前实现代码

日志调用代码

LOG_POSITION << simTime() << "," << getFullName() << "," << latitude << "," << longitude << "," << test;

logger.h 文件

#pragma once

#define BOOST_LOG_DYN_LINK 1
#include <boost/log/expressions.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup.hpp>

#define LOG_POSITION        BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::info)
#define WARN1               BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::warning)
#define ERROR1              BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::error)

#define SYS_LOGFILE             "../resources/logs/droneMovements.log"

typedef boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> logger_t;

BOOST_LOG_GLOBAL_LOGGER(my_logger, logger_t)

logger.cc 文件

#include "logger.h"

namespace attrs   = boost::log::attributes;
namespace expr    = boost::log::expressions;
namespace logging = boost::log;

BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, logger_t)
{
    logger_t lg;

    logging::add_common_attributes();

    logging::add_file_log(
            boost::log::keywords::file_name = SYS_LOGFILE,
            boost::log::keywords::format = (expr::stream
                                            << expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y%m%d%H%M%S.%f,")
                                            << expr::smessage)
    );

    logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::info);

    return lg;
}

解决方案

需要完成两个核心修改:自动写入唯一表头和调整日志格式匹配表头字段。

1. 调整日志格式,补充TYPE字段

当前日志格式缺少表头中的TYPE字段(即日志级别,如[info]),需要在format中添加该字段:

修改logger.cc中的add_file_log格式部分:

logging::add_file_log(
        boost::log::keywords::file_name = SYS_LOGFILE,
        boost::log::keywords::format = (expr::stream
                                        << expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y%m%d%H%M%S.%f,")
                                        << "[" << logging::trivial::severity << "],"
                                        << expr::smessage)
);

这样日志会自动追加[info]/[warning]等级别标识,匹配表头的TYPE字段。

2. 初始化时自动写入表头(仅一次)

通过检查日志文件是否为空,在logger初始化时写入表头,确保表头只出现一次:

首先在logger.cc中添加文件系统相关头文件(需C++17及以上,或改用Boost Filesystem):

#include <filesystem>
namespace fs = std::filesystem;

然后在BOOST_LOG_GLOBAL_LOGGER_INIT函数中添加表头写入逻辑:

BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, logger_t)
{
    logger_t lg;

    // 检查日志文件是否不存在或为空
    if (!fs::exists(SYS_LOGFILE) || fs::file_size(SYS_LOGFILE) == 0) {
        std::ofstream log_file(SYS_LOGFILE, std::ios_base::out | std::ios_base::app);
        if (log_file.is_open()) {
            log_file << "YYYYMMDDHHMMSS.MS,TYPE,SIMULATION_TIME,PLATFORM_ID,LATITUDE,LONGITUDE,ELEVATION\n";
            log_file.close();
        }
    }

    logging::add_common_attributes();

    logging::add_file_log(
            boost::log::keywords::file_name = SYS_LOGFILE,
            boost::log::keywords::format = (expr::stream
                                            << expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y%m%d%H%M%S.%f,")
                                            << "[" << logging::trivial::severity << "],"
                                            << expr::smessage)
    );

    logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::info);

    return lg;
}

3. 清理无用宏定义

删除logger.h中未使用的LOG_POSITION_HEADER宏:

// 移除该行:#define LOG_POSITION_HEADER BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::info)

修改完成后,日志文件初始化时会自动写入表头,后续日志格式完全匹配需求,可直接用Pandas的read_csv函数读取分析:

import pandas as pd
df = pd.read_csv("../resources/logs/droneMovements.log")

内容的提问来源于stack exchange,提问作者abc def

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:00:55