百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

C++开发:打印日志的方式总结

liebian365 2024-12-01 00:24 35 浏览 0 评论

在 C++ 中,打印日志的方式有很多种,具体选择哪种方式取决于你的需求和项目的复杂性。以下是一些常见的日志打印方式:

1. 使用标准输出 (std::cout)

这是最简单的日志打印方式,适用于小型项目或简单的调试。

#include <iostream>

int main() {
    std::cout << "This is a log message." << std::endl;
    return 0;
}

2. 使用文件输出 (std::ofstream)

将日志写入文件,适用于需要持久化日志的场景。

#include <iostream>
#include <fstream>

int main() {
    std::ofstream logFile("log.txt");
    if (logFile.is_open()) {
        logFile << "This is a log message." << std::endl;
        logFile.close();
    } else {
        std::cerr << "Unable to open log file." << std::endl;
    }
    return 0;
}

3. 使用日志库

3.1.Boost.Log

Boost.Log 是一个功能强大的日志库,适用于需要复杂日志功能的项目。

#include <boost/log/trivial.hpp>

int main() {
    BOOST_LOG_TRIVIAL(info) << "This is an informational message.";
    BOOST_LOG_TRIVIAL(error) << "This is an error message.";
    return 0;
}

3.2.spdlog

spdlog 是一个快速、简单、易用的日志库,适用于高性能需求的项目。

#include "spdlog/spdlog.h"

int main() {
    spdlog::info("This is an info message.");
    spdlog::error("This is an error message.");
    return 0;
}

3.3.log4cpp

log4cpp 是一个类似于 Java 的 log4j 的日志库,适用于需要高度配置和扩展性的项目。

#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>

int main() {
    log4cpp::PropertyConfigurator::configure("log4cpp.properties");
    log4cpp::Category& root = log4cpp::Category::getRoot();
    root.info("This is an info message.");
    root.error("This is an error message.");
    return 0;
}

4. 自定义日志类

创建一个自定义的日志类,可以更好地控制日志的格式和输出位置。

#include <iostream>
#include <fstream>
#include <string>

class Logger {
public:
    enum LogLevel {
        INFO,
        ERROR
    };

    Logger(const std::string& filename) : logFile(filename, std::ios::app) {}

    ~Logger() {
        if (logFile.is_open()) {
            logFile.close();
        }
    }

    void log(LogLevel level, const std::string& message) {
        if (logFile.is_open()) {
            logFile << "[" << getLevelString(level) << "] " << message << std::endl;
        } else {
            std::cerr << "Unable to open log file." << std::endl;
        }
    }

private:
    std::ofstream logFile;

    std::string getLevelString(LogLevel level) {
        switch (level) {
            case INFO: return "INFO";
            case ERROR: return "ERROR";
            default: return "UNKNOWN";
        }
    }
};

int main() {
    Logger logger("log.txt");
    logger.log(Logger::INFO, "This is an info message.");
    logger.log(Logger::ERROR, "This is an error message.");
    return 0;
}

5. 使用宏定义

使用宏定义可以简化日志调用,增加灵活性。

#include <iostream>
#include <fstream>

#define LOG_INFO(message) \
    { std::ofstream logFile("log.txt", std::ios::app); \
    logFile << "[INFO] " << message << std::endl; }

#define LOG_ERROR(message) \
    { std::ofstream logFile("log.txt", std::ios::app); \
    logFile << "[ERROR] " << message << std::endl; }

int main() {
    LOG_INFO("This is an info message.");
    LOG_ERROR("This is an error message.");
    return 0;
}

6. 使用第三方框架

现代 C++ 项目通常使用如 glog 或 easylogging++ 等第三方日志框架,这些框架提供了丰富的功能和配置选项。

6.1.glog

#include <glog/logging.h>

int main(int argc, char* argv[]) {
    google::InitGoogleLogging(argv[0]);
    LOG(INFO) << "This is an info message.";
    LOG(ERROR) << "This is an error message.";
    return 0;
}

6.2.easylogging++

#include "easylogging++.h"

INITIALIZE_EASYLOGGINGPP

int main() {
    LOG(INFO) << "This is an info message.";
    LOG(ERROR) << "This is an error message.";
    return 0;
}

7. 使用系统日志

在 Linux 系统上,可以使用 syslog 来记录系统日志。

#include <syslog.h>

int main() {
    openlog("myapp", LOG_PID|LOG_CONS, LOG_USER);
    syslog(LOG_INFO, "This is an info message.");
    syslog(LOG_ERR, "This is an error message.");
    closelog();
    return 0;
}

结论

不同的日志打印方式适用于不同的场景和需求。对于简单的调试,可以使用 std::cout 或 std::ofstream。对于复杂的项目,建议使用成熟的日志库,如 Boost.Log、spdlog 或 log4cpp。对于高性能需求,可以选择 spdlog。对于需要与系统日志集成的应用,可以使用 syslog。根据项目需求选择合适的日志打印方式,可以提高开发效率和代码的可维护性。

相关推荐

Linux-常用操作命令介绍(linux常用的命令大全)

1.帮助命令帮助命令1.1help命令语法格式:命令--help作用:查看某个命令的帮助信息示例#ls--help#netstat--help1.2man命令语法格式:man命令...

推荐:一个小而美的Java工具类库(java工具软件)

前言是的,你没看错,没看错,它就是hutool!相信很多做java开发的朋友应该都已经认识并使用过它了,今天带大家再重温一下它都有哪些功能,并以示例来看看hutool是如何简便实现JWT认...

【SpringBoot后端开发】第三部分 Linux操作系统常用命令(3)

创作不易,请帮忙转发、点赞和评论!四、Linux常用命令对于Linux系统来说,中央处理器、内存、磁盘驱动器、键盘、鼠标、用户等都是文件,而Linux系统管理的命令是它正常运行的核心,与之DOS命令类...

linux常用命令在线查询工具(linux常用命令在线查询工具有哪些)

linuxvi编辑器常用命令linux查看iplinuxfind-name查找文件名linuxshelllinux查看端口占用linux删除文件命令linuxcp命令复制文件到另一个...

使用免费绿色工具chfs,将文件夹共享成网盘

需求:业务需求方有个需要将apk包上传到服务器中,通过chfs可以将服务器目录共享出来,可以可以登录后台自行上传apk文件包。本文就教大家三个知识点1.centos7下使用chfs,共享目录。2.使用...

Mysql和Hive之间通过Sqoop进行数据同步

文章回顾理论大数据框架原理简介大数据发展历程及技术选型实践搭建大数据运行环境之一搭建大数据运行环境之二本地MAC环境配置CPU数和内存大小查看CPU数sysctlmachdep.cpu#核数为...

真实案例记录Linux被植入rootkit导致服务器带宽跑满的解决过程

一、关于linux下的rootkitrootkit是Linux平台下最常见的一种木马后门工具,它主要通过替换系统文件来达到攻击和和隐蔽的目的,这种木马比普通木马后门更加危险和隐蔽,普通的检测工...

python周期任务调度工具Schedule使用详解

如果你想周期性地执行某个Python脚本,最出名的选择应该是Crontab脚本,但是Crontab具有以下缺点:不方便执行秒级任务。当需要执行的定时任务有上百个的时候,Crontab的管...

Linux 系统日常巡检脚本(shell巡检脚本)

Linux系统日常巡检脚本,巡检内容包含了,磁盘,内存cpu进程文件更改用户登录等一系列的操作直接用就行了。报告以邮件发送到邮箱在log下生成巡检报告。#!/bin/bash#@Au...

Schedule—简单实用的 Python 周期任务调度工具

如果你想周期性地执行某个Python脚本,最出名的选择应该是Crontab脚本,但是Crontab具有以下缺点:1.不方便执行秒级任务。2.当需要执行的定时任务有上百个的时候,Cronta...

celery定时与异步任务详解(定时任务异步执行)

celery简介Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。Celery的架构由三部分组成,消息中间件(messagebroke...

开源免费的定时任务管理系统:Gocron

Gocron:精准调度未来,你的全能定时任务管理工具!-精选真开源,释放新价值。概览Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发,是一个轻量级定时任务集中调度和管理...

PHP Laravel定时任务Schedule(laravel定时任务原理)

前提:本文方法是利用Linux的crontab定时任务来协助实现Laravel调度(Mac也一样)。一、首先添加Crontab定时任务,这里只做简单介绍:用命令crontab-e添加如下内容**...

Linux的常用命令就是记不住,怎么办?于是推出了这套教程

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

如何定期执行 Python 脚本:5 种常见方法

定期执行任务是自动化工作流程中的重要环节,无论是数据抓取、文件备份,还是定期报告生成,定时运行脚本都可以极大提高效率。本文将介绍五种方法,通过这些方法,你可以轻松设置定期执行Python脚本的任务...

取消回复欢迎 发表评论: