syslog 使用及宏

需求 syslog 虽然使用起来很方便,但是直接使用有几个问题: 虽然有日志信息,但是不够全面不方便定位 那么多的日志都混在一起,没有重点,调试时不方便 debug 和 release 时,日志应该不一样。 解决 日志信息更丰富 syslog 可以使用 __FILE__, __LINE__, __FUNCTION, 这几个来标识出当前的日志是在那个文件,第几行,哪个函数输出的。 syslog(LOG_DEBUG, "%s: %d: %s --> class construct", __FILE__, __LINE__, __FUNCTION__); 使用宏来开关日志 下面这个是普通替代的宏,可以用于开关日志. #ifdef xxx #define LOG(priority, format, ...) syslog(priority, format, ## __VA_ARGS__) #else #define LOG(priority, format, ...) #endif 使用宏来减少输入 但是每条日志都要这样写,就太麻烦了,我们可以使用宏来解决这个问题: #define LOG(priority, format, ...) syslog(priority, "%s: %d: %s --> "#format, __FILE__, __LINE__, __FUNCTION__, ## __VA_ARGS__) LOG(LOG_DEBUG, "class construct"); 上面这条宏,我们在使用时,不需要显式的写出相关的参数,宏展开的时候,会自动帮我们加上这些参数,日志会包含文件名,行号,函数名. 使用宏增加日志等级 当多条日志信息在一起的时候,比较难抓住重点,虽然可以使用搜索,但是终归没有那么方便。我们可以通过宏给日志消息里面附上对应的等级,也方便后期维护时使用脚本进行解析。 #define LOG(priority, format, ....

<span title='2023-03-06 15:02:00 +0800 CST'>2023-03-06</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;223 words&nbsp;·&nbsp;RamLife

换行符的转换

需求 windows 平台复制到 linux 平台的文件,换行符需要转换到 linux 模式,需要相应的批量转换方式。 解决 使用 dos2unix 即可。 安装 sudo apt install dos2unix 使用 dos2unix path/ 参考 Linux、Windows、Mac换行符相互转换方法

<span title='2023-02-15 18:34:00 +0800 CST'>2023-02-15</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;21 words&nbsp;·&nbsp;RamLife

QT 在 win 平台编辑,在 Linux 平台调试

需求 需要在 windows 平台使用 qtcreator 编辑,在 linux 平台下编译并调试,综合考虑还是 samba 最简单适合。 解决 linux 设备建立 qt 的工程. 复制工程目录下的 .pro.user, 并重命名在后面增加 .linux 的后缀。 linux 设备开启 samba. 并把工程文件夹共享出来。 windows 设备把 samba 目录映射为网络驱动器。 windows 上的 qtcreator 打开 samba 中的工程,会提示工程有些问题,并让你重新选择编译工具。 qtcreator 会自动重命名原来的 .pro.user, 在后面追加一串字符。 在 linux 设备,复制工程目录下的 .pro.user, 并重命名在后面增加 .win 的后缀。 建立两个脚本文件,一个用来复制 .linux 覆盖当前的 .pro.user, 另一个是用 .win 来覆盖。 使用时,在 win 可以正常的进行代码编辑,在 linux 调试前,执行脚本,替换为 linux 的 .pro.user, 当调试完成后,返回 win 进行编辑时,再替换成 win 的 .pro.user. 参考 ubuntu 20.04 安装配置Samba服务,Windows 和 linux协同工作

<span title='2023-02-15 17:01:00 +0800 CST'>2023-02-15</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;72 words&nbsp;·&nbsp;RamLife

Ubuntu 20.04 安装配置 samba

需求 需要在 win 平台编辑代码,在 linux 平台进行编译和调试。这种情况只能使用 samba 才比较方便,nfs 必须双方都是 linux。 解决 安装 samba sudo apt install samba samba-common 共享目录 对于需要共享的目录可能需要使用 chmod 修改权限 如果共享的目录归属用户和 samba 用户一致,那么只要保证目录是 0755 即可 如果共享的目录归属用户组和 samba 用户的用户组一致,那么只要保证目录是 0775 即可 如果共享的目录归属用户和用户组和 samba 用户和用户组都不一致,那么只有修改目录权限为 0777 才可以。 chmod -R 777 /home/username/director 添加 samba 用户 添加已有用户为 samba 用户 sudo smbpasswd -a username 配置 samba 备份 samba 配置文件: sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak 在配置文件最后增加: [workspace] #共享名,该共享标签,可随意取,该名字为在其他电脑上看到的共享名 comment = work directories #该共享描述 browseable = yes path = /home/username/work #共享路径 valid users = username writable = yes #writable用来指定该共享路径是否可写 guest ok = no #指定该共享是否允许guest账户访问 read only = no create mask = 0775 directory mask = 0775 重启 samba 服务 sudo /etc/init....

<span title='2023-02-14 11:27:00 +0800 CST'>2023-02-14</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;119 words&nbsp;·&nbsp;RamLife

QT C++ 识别当前操作系统平台,并编译相应代码

需求 需要在 Qt 中检测当前的操作系统平台具体是 win 还是 linux,然后根据不同的平台执行不同的代码。比如在 linux 平台可以使用 syslog 解决 #ifdef Q_OS_LINUX #include <syslog.h> #endif #ifdef Q_OS_WIN #endif #ifdef Q_OS_OSX #endif #ifdef Q_OS_LINUX openlog(NULL, LOG_CONS | LOG_NDELAY | LOG_NOWAIT | LOG_PID, LOG_LOCAL0); setlogmask(LOG_UPTO(LOG_MASK_BUILD)); #endif syslog(LOG_DEBUG, "%s: %d: %s --> class construct", __FILE__, __LINE__, __FUNCTION__); 参考 Qt判断当前系统 QT C++识别当前操作系统

<span title='2023-02-14 09:34:00 +0800 CST'>2023-02-14</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;49 words&nbsp;·&nbsp;RamLife

系统日志 syslog 相关函数使用

需求 需要让 linux 平台的软件能够输出日志,便于后期的调试和分析。 解决 linux 平台原生支持 syslog 类型的日志服务,不同的发行版可能不同,有可能是 syslog, syslog-ng, rsyslogd 等等。但是具体的程序中输出日志的函数其实是一样的,主要就是三个函数 openlog(), syslog(), closelog(). 调用 syslog 函数之前,首先需要包含相应的头文件 #include <syslog.h> openlog 函数原型为: void openlog(const char *ident, int option, int facility);, 作用是打开一个到系统日志记录程序的连接,实际使用时,这个函数可以省略,在调用 syslog() 时,如果没有打开,会自动打开一个。但是显式使用 openlog 可以进行更多的设定。 ident, 设置日志中的生成者的标识,正常使用 NULL 就可以了,会使用程序名进行标识。如果需要自定义一个标识,那么输入字符串即可。 option, 设置日志相关属性,简单的可以使用 openlog(NULL, LOG_CONS|LOG_PID, 0); 即可,复杂的使用 openlog(NULL, LOG_CONS | LOG_NDELAY | LOG_NOWAIT | LOG_PID, LOG_LOCAL0);, 具体的含义可以 man openlog 可选配置 描述 LOG_CONS 直接写入系统控制台,如果有一个错误,同时发送到系统日志记录。 LOG_NDELAY 立即打开连接(通常,打开连接时记录的第一条消息)。 LOG_NOWAIT 不要等待子进程,因为其有可能在记录消息的时候就被创建了(GNU C库不创建子进程,所以该选项在Linux上没有影响。) LOG_ODELAY 延迟连接的打开直到syslog函数调用。(这是默认情况下,需要没被指定的情况下。) LOG_PERROR (不在SUSv3情况下)同时输出到stderr(标准错误文件)。 LOG_PID 包括每个消息的PID。 facility, 正常为 0 即可。 设置 描述 LOG_AUTH 认证系统:login、su、getty等 LOG_AUTHPRIV 同LOG_AUTH,但只登录到所选择的单个用户可读的文件中 LOG_CRON cron守护进程 LOG_DAEMON 其他系统守护进程,如routed LOG_FTP 文件传输协议:ftpd、tftpd LOG_KERN 内核产生的消息 LOG_LPR 系统打印机缓冲池:lpr、lpd LOG_MAIL 电子邮件系统 LOG_NEWS 网络新闻系统 LOG_SYSLOG 由syslogd(8)产生的内部消息 LOG_USER 随机用户进程产生的消息 LOG_UUCP UUCP子系统 LOG_LOCAL0~LOG_LOCAL7 为本地使用保留 syslog 函数原型为 void syslog(int priority, char*format,……);, 有需要输出的日志信息,就调用这个函数进行输出。...

<span title='2023-02-14 09:34:00 +0800 CST'>2023-02-14</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;142 words&nbsp;·&nbsp;RamLife