色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Log4cpp優勢及優點

科技綠洲 ? 來源:Linux開發架構之路 ? 作者:Linux開發架構之路 ? 2023-11-09 14:27 ? 次閱讀

1、log4cpp概述

Log4cpp是一個開源的C++類庫,它提供了C++程序中使用日志和跟蹤調試的功能,它的優點如下:

  • 提供應用程序運行上下文,方便跟蹤調試;
  • 可擴展的、多種方式記錄日志,包括命令行、文件、回卷文件、內存、syslog服務器、Win事件日志等;
  • 可以動態控制日志記錄級別,在效率和功能中進行調整;
  • 所有配置可以通過配置文件進行動態調整;
  • 多語言支持,包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等;

類似日志工具:glog、boost.log、spdlog

圖片

2、原理

Log4cpp有三個主要的組件:日志類別(Category)、輸出源(Appender)和布局(Layout)。這三種類型的組件一起工作使得系統可以根據信息的類型和級別記錄它們,并且在運行時控制這些信息的輸出格式和位置。

三個組件的介紹:

1)日志類別(Category)含義是:如果配置文件中設置的級別是DEBUG,則任意的log都能打印出來;但如果配置的級別是ERROR,則只有高于ERROR優先級的日志才可以打印出來。

日志的常用優先級:DEBUG < INFO < WARN < ERROR < FATAL

2)輸出源(Appender)用來輸出日志(被layout格式化后)到一些設備上,比如文件、命令行、內存等。也可以定義自己的appender輸出日志信息到別的設備上。log4cpp提供的appender如下:FileAppender 輸出到文件 RollingFileAppender 輸出到回卷文件,即當文件到達某個大小后回卷 ConsoleAppender 輸出到控制臺

3)布局(Layout):顯示樣式PatternLayout表示讓用戶根據類似于C語言printf函數的轉換模式來指定輸出格式

三個組件之間的關系:

  • Category和Appender的關系是:多個Appender可以附加到一個Category上,這樣一個日志消息可以同時輸出到多個設備上。
  • Appender和Layout的關系是:Layout附加在Appender上,appender調用layout處理完日志消息后,記錄到某個設備上。

3 log4cplus的安裝

log4cplus是開源的,源代碼可在這里找到。下載源代碼壓縮包后解壓,進入主目錄。和大多數autotools工程一樣,順序執行以下命令即可完成安裝。

./configure
make
make install

安裝文件將默認安裝到/usr/local,庫文件置于/usr/local/lib,頭文件置于/usr/local/include。

是的,這里介紹的安裝及下面介紹的應用都是基于linux系統。

4 log4cplus的使用

以下是官方提供的“hello, world”的示例程序:

#include
#include
#include
#include

using namespace log4cplus;

int main()
{
BasicConfigurator config;
config.configure();

Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));
LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
return 0;
}

程序包含了一些必要的頭文件,編譯時需要鏈接log4cplus庫,將這段代碼保存為 test.cpp,執行以下命令編譯:

g++ test.cpp -o test -llog4cplus

編譯后生成 test 可執行文件,運行./test,得到如下輸出:

WARN - Hello, World!

這個程序使用的是log4cplus內置的默認配置選項,實際使用中一般要自己配置選項,接下來你會看到。

5 log4cplus配置

log4cplus配置就是定義appender, 定義輸出的格式即 layout。以下列出兩種常用配置,以供參考。

配置輸出到控制臺(通常用于前臺程序):

log4cplus.logger.logmain = TRACE, console
log4cplus.appender.console = log4cplus::ConsoleAppender
log4cplus.appender.console.layout = log4cplus::PatternLayout
log4cplus.appender.console.layout.ConversionPattern = [%D{%m/%d/%y %H:%M:%S,%q} %-5p] - %m%n

配置輸出到文件(通常用于后臺程序):

log4cplus.logger.logmain = INFO, file
log4cplus.appender.file = log4cplus::FileAppender
log4cplus.appender.file.File = /var/log/myapp.log
log4cplus.appender.file.MaxFileSize = 10M
log4cplus.appender.file.Append = true
log4cplus.appender.file.layout = log4cplus::PatternLayout
log4cplus.appender.file.layout.ConversionPattern = [%D{%m/%d/%y %H:%M:%S,%q} %-5p] - %m%n

簡單說明一下,配置文件中log4cplus.logger.logmain即定義一個logmain對象,后面跟的兩個字段前一個表示log級別,后一個指定使用的appender,即日志輸出對象。log級別按嚴重程度從低到高依次為TRACE、DEBUG、INFO、WARN、ERROR、FATAL。log4cplus.appender.xxx定義具體的appender屬性,如是控制臺還是文件,進一步配置文件名、文件大小等。

將配置保存到一個配置文件中(如log4cplus.conf),以下你將看到如何使用配置文件。有關更詳細的配置,讀者可自行摸索。

6 log4cplus運用于項目

以上“hello, world”程序只是大概演示log4cplus的用法,實際項目使用要有系統觀念,就是怎樣用才更方便,我們可以再做點封裝。我們可以定義一個全局logger對象,將log4cplus初始化配置放到一個源文件中,重新定義一些簡化的宏置于頭文件,比如筆者就定義了Log.h/Log.cpp兩個文件,代碼如下:

Log.h文件:

#pragma once

#include
#include

using namespace log4cplus;
using namespace log4cplus::helpers;

// global object
extern Logger logger;

// define some macros for simplicity
#define LOG_TRACE(logEvent) LOG4CPLUS_TRACE(logger, logEvent)
#define LOG_DEBUG(logEvent) LOG4CPLUS_DEBUG(logger, logEvent)
#define LOG_INFO(logEvent) LOG4CPLUS_INFO(logger, logEvent)
#define LOG_WARN(logEvent) LOG4CPLUS_WARN(logger, logEvent)
#define LOG_ERROR(logEvent) LOG4CPLUS_ERROR(logger, logEvent)
#define LOG_FATAL(logEvent) LOG4CPLUS_FATAL(logger, logEvent)

extern void InitLogger(bool daemonized);

Log.cpp文件:

#include
#include
#include
#include
#include

#include "Log.h"

Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("logmain"));

void InitLogger(bool daemonized)
{
if (daemonized)
PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("/your/path/log4cplusd.conf"));
else
PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("/your/path/log4cplus.conf"));
}

將這兩個文件置于你的項目中,然后在 main 函數中調用 InitLogger() 初始化 log4cplus,再在需要加log的文件中包含Log.h即可。注意InitLogger函數的參數daemonized,該參數表示應用程序是否是守護進程(后臺運行),一般我們開發的應用程序大多是守護進程(linux后臺服務大多是守護進程),但調試的時候會前臺運行,對于守護進程,我們只需要把日志記錄到某個文件中就行了,而對于前臺調試運行,我們就只需要將日志輸出到控制臺,所以這里是一點使用技巧。做到這點我們只需分別提供兩個配置文件即可,"/your/path"就是你放置配置文件的地方,一般可以設為你應用程序部署的目錄下的etc目錄。

至此我們可以使用log4cplus了!以下是實際的日志輸出效果:

[11/05/12 10:28:36,002 INFO ] - TCPDomain - TCPDomain()
[11/05/12 10:28:36,002 INFO ] - TCPDomain - Connect server success!
[11/05/12 10:28:36,002 TRACE] - Session - Thread run.
[11/05/12 10:28:46,006 ERROR] - TCPDomain - SelectRead time out!
[11/05/12 10:28:56,016 ERROR] - TCPDomain - SelectRead time out!

7 log4cplus交叉編譯

對于嵌入式應用 ,有交叉編譯這么一說。以上的介紹是基于PC的,如果你的平臺是嵌入式平臺如arm,則只需編譯鏈接arm平臺的log4cplus庫即可,其它都一樣。對于大多數autotools工程,其交叉編譯方法大致如下:

./configure --prefix=/your/install/path --host=arm-linux CXX=your-toolkit-g++
make
make install

其中--prefix即指定你的安裝目錄,如/opt/log4cplus,--host指定目標平臺,CXX指定你的交叉編譯工具(確保shell環境能找到該工具)。編譯安裝完后可在安裝目錄找到arm版本的庫文件。

8 總結

日志固然好,但也不建議隨意使用,用多了會導致程序性能有所下降,且代碼size增加不少。以上是筆者運用log4cplus的些許經驗,更深一步的原理機制有待進一步探究。

配置文件

1 #-------定義rootCategory的屬性-------
2
3 #指定rootCategory的log優先級是ERROR,其Appenders有兩個,分別是console,TESTAppender
4 log4cpp.rootCategory=ERROR, console,TESTAppender
5
6 #-------定義console屬性-------
7
8 #consoleAppender類型:控制臺輸出
9 #下面這三條語句表示控制臺輸出的log輸出的布局按照指定的格式;輸出格式是:[%p] %d{%H:%M:%S.%l} (%c): %m%n
10 log4cpp.appender.console=ConsoleAppender
11 log4cpp.appender.console.layout=PatternLayout
12 log4cpp.appender.console.layout.ConversionPattern=[%p] %d{%H:%M:%S.%l} (%c): %m%n
13
14 #-------定義TESTAppender的屬性-------
15
16 #RollingFileAppender類型:輸出到回卷文件,即文件到達某個大小的時候產生一個新的文件
17 #下面的語句表示文件輸出到指定的log文件,輸出的布局按照指定的格式,輸出的格式是:[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n
18 log4cpp.appender.TESTAppender=RollingFileAppender
19
20 #當日志文件到達maxFileSize大小時,將會自動滾動
21 log4cpp.appender.TESTAppender.maxFileSize=400000
22
23 #maxBackupIndex指定可以產生的滾動文件的最大數
24 log4cpp.appender.TESTAppender.maxBackupIndex=3
25
26 #fileName指定信息輸出到logs/TESTAppender.txt文件
27 log4cpp.appender.TESTAppender.fileName=logs/TESTAppender.txt
28
29 #PatternLayout 表示可以靈活指定布局模式
30 log4cpp.appender.TESTAppender.layout=PatternLayout
31
32 #append=true 信息追加到上面指定的日志文件中,false表示將信息覆蓋指定文件內容
33 log4cpp.appender.TESTAppender.append=true
34 log4cpp.appender.TESTAppender.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n

ConversionPattern的參數含義:

%d 輸出日志時間點的日期或時間,可以在其后指定格式,如上%d{%Y-%m-%d %H:%M:%S.%l},輸出類似:2017-02-14 09:25:00.953
%p 優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%c 輸出日志信息所屬的類目,通常就是所在類的全名
%m 輸出log的具體信息
%n 回車換行

自定義封裝

將上述過程封裝,即可得到自己的日志類

/*采用單例模式設計,包含兩個category對象,一個負責輸出到屏幕的信息,一個負責記錄到日志的信息,通過設置優先級差別,可以實現所有信息都記錄在日志中,遇到error及以上的信息時打印到屏幕上*/
class MyLog
{
private:
MyLog(bool b)
{
outToScreen = b;
}
~MyLog(){}
static MyLog * log;
bool outToScreen;//是否輸出日志信息到屏幕
static std::string _screenInfo;//屏幕日志信息
static std::string _logName;//文件日志名稱
static log4cpp::Category& logCat;
static log4cpp::Category& coutCat;
static log4cpp::FileAppender* logFile;//文件日志輸入
static log4cpp::OstreamAppender* logScreen;//屏幕日志輸入
static log4cpp::Priority::PriorityLevel logPri;//文件日志優先級
static log4cpp::Priority::PriorityLevel coutPri;//屏幕日志優先級
static log4cpp::PatternLayout* logLayout;//日志布局
static log4cpp::PatternLayout* screenLayout;//屏幕布局
public:
//獲取日志函數,默認參數選擇是否輸出到屏幕
static MyLog* getLog(bool toScreen = true,std::string coutName ="screenInfo",std::string logName = "log"){
if(MyLog::log == NULL)
{
MyLog::log = new MyLog(toScreen);

MyLog::_logName = logName;
MyLog::_screenInfo = coutName;

logScreen = new log4cpp::OstreamAppender("logScreen",&std::cout);
logFile = new log4cpp::FileAppender("logFile",MyLog::_logName);

//設置布局
MyLog::logLayout = new log4cpp::PatternLayout();
MyLog::screenLayout = new log4cpp::PatternLayout();
logLayout->setConversionPattern("%d{%Y/%m/%d,%H:%M:%S} -- [%p] %c: %m%n");
screenLayout->setConversionPattern("%d{%Y/%m/%d %H:%M:%S} -- [%p] %c: %m%n");
MyLog::logScreen->setLayout(screenLayout);
MyLog::logFile->setLayout(logLayout);

//追加到目錄
MyLog::logCat.addAppender(MyLog::logFile);
MyLog::coutCat.addAppender(MyLog::logScreen);
//設置優先級
MyLog::logCat.setPriority(MyLog::logPri);
MyLog::coutCat.setPriority(MyLog::coutPri);
}
MyLog::log->outToScreen = toScreen;


return MyLog::log;
}
//銷毀日志對象
static void destoryLog()
{
log4cpp::Category::shutdown();
delete MyLog::log;
}
//設置日志記錄優先級
static void setPri(log4cpp::Priority::PriorityLevel coutLevel,log4cpp::Priority::PriorityLevel logLevel)
{
MyLog::logPri = logLevel;
MyLog::coutPri = coutLevel;
MyLog::logCat.setPriority(MyLog::logPri);
MyLog::coutCat.setPriority(MyLog::coutPri);
}
//記錄日志,調用參數__FILE__, __LINE__ ,__FUNCTION__
void warn(const char * msg,const char *filename = __FILE__,int line = __LINE__,const char *function = "warn")
{
char info[4096] = {0};
sprintf(info,"nIn file %s,line %d,function %s:%s",filename,line,function,msg);
if(this->outToScreen)
{
logCat.warn(info);
coutCat.warn(info);
}
else
{
logCat.warn(info);
}
}
void error(const char * msg,const char *filename = __FILE__,int line = __LINE__,const char *function = "error")
{
char info[4096] = {0};
sprintf(info,"nIn file %s,line %d,function %s:%s",filename,line,function,msg);
if(this->outToScreen)
{
logCat.error(info);
coutCat.error(info);
}
else
{
logCat.error(info);
}
}
void debug(const char * msg,const char *filename = __FILE__,int line = __LINE__,const char *function = "debug")
{
char info[4096] = {0};
sprintf(info,"nIn file %s,line %d,function %s:%s",filename,line,function,msg);
if(this->outToScreen)
{
logCat.debug(info);
coutCat.debug(info);
}
else
{
logCat.debug(info);
}
}
void info(const char * msg,const char *filename = __FILE__,int line = __LINE__,const char *function = "info")
{
char info[4096] = {0};
sprintf(info,"nIn file %s,line %d,function %s:%s",filename,line,function,msg);

if(this->outToScreen)
{
logCat.info(info);
coutCat.info(info);
}
else
{
logCat.info(info);
}
}
};
MyLog* MyLog::log = NULL;
std::string MyLog::_screenInfo = "screenInfo";
std::string MyLog::_logName = "log";

log4cpp::Category& root = log4cpp::Category::getRoot();
log4cpp::Category& MyLog::logCat = root.getInstance(MyLog::_logName);
log4cpp::Category& MyLog::coutCat = root.getInstance(MyLog::_screenInfo);

log4cpp::Priority::PriorityLevel MyLog::coutPri = log4cpp::Priority::INFO;
log4cpp::Priority::PriorityLevel MyLog::logPri = log4cpp::Priority::NOTSET;

log4cpp::PatternLayout* MyLog::logLayout = NULL;
log4cpp::PatternLayout* MyLog::screenLayout = NULL;

log4cpp::FileAppender* MyLog::logFile = NULL;//文件日志輸入
log4cpp::OstreamAppender* MyLog::logScreen = NULL;//屏幕日志輸入

//為避免每次調用都要填寫參數__FILE__,__LINE__和__FUNCTION__,可以使用帶參數的宏定義
#define MyLogWARN(msg) MyLog::getLog()->warn(msg,__FILE__,__LINE__,__FUNCTION__);
#define MyLogINFO(msg) MyLog::getLog()->info(msg,__FILE__,__LINE__,__FUNCTION__);
#define MyLogERROR(msg) MyLog::getLog()->error(msg,__FILE__,__LINE__,__FUNCTION__);
#define MyLogDEBUG(msg) MyLog::getLog()->debug(msg,__FILE__,__LINE__,__FUNCTION__);

發送到遠程服務器

應用程序中SocketAppender配置

前面啟動了LoggingServer,下面說一下需要收集其日志的各個應用程序中配置。

說白了,就是在原來的基礎上加一個SocketAppender,SocketAppender會自動將日志發送給loggingserver。這樣直接在loggingserver上就可以查看所有服務器上的日志信息啦。哥終于不用再擔心你們的運行狀態啦!

配置文件

log4cplus.rootLogger=TRACE,STDOUT, ALL_MSGS,RemoteServer
log4cplus.logger.rollfile=TRACE,R2

log4cplus.appender.STDOUT=log4cplus::ConsoleAppender
log4cplus.appender.STDOUT.layout=log4cplus::PatternLayout
log4cplus.appender.STDOUT.layout.ConversionPattern=@@@[%d %d{%Z %Q}][pthread_id:%t][%l][%-5p][%c{2}] - %m%n

log4cplus.appender.R2=log4cplus::RollingFileAppender
log4cplus.appender.R2.File=./mytest.log
log4cplus.appender.R2.MaxFileSize=4MB
log4cplus.appender.R2.MaxBackupIndex=5
log4cplus.appender.R2.layout=log4cplus::PatternLayout
log4cplus.appender.R2.layout.ConversionPattern=@@@[%d %d{%Z %Q}][pthread_id:%t][%l][%-5p][%c{2}] - %m%n

log4cplus.appender.RemoteServer=log4cplus::SocketAppender
log4cplus.appender.RemoteServer.host=192.168.2.130
log4cplus.appender.RemoteServer.port=9000

還可以輸出到多個server,配置如下:

log4cplus.rootLogger=TRACE, STDOUT, ALL_MSGS,RemoteServer,RemoteServer2
log4cplus.logger.rollfile=TRACE,R2

log4cplus.appender.STDOUT=log4cplus::ConsoleAppender
log4cplus.appender.STDOUT.layout=log4cplus::PatternLayout
log4cplus.appender.STDOUT.layout.ConversionPattern=@@@[%d %d{%Z %Q}][pthread_id:%t][%l][%-5p][%c{2}] - %m%n
#log4cplus.appender.STDOUT.layout.ConversionPattern=@@@[%l][%-5p] - %m%n

log4cplus.appender.R2=log4cplus::RollingFileAppender
log4cplus.appender.R2.File=/opt/apps/3k/i1client/i1client.log
log4cplus.appender.R2.MaxFileSize=10000KB
log4cplus.appender.R2.MaxBackupIndex=100
log4cplus.appender.R2.layout=log4cplus::PatternLayout
log4cplus.appender.R2.layout.ConversionPattern=@@@[%d %d{%Z %Q}][pthread_id:%t][%l][%-5p][%c{2}] - %m%n
#log4cplus.appender.R2.layout.ConversionPattern=@@@[%l][%-5p] - %m%n

log4cplus.appender.RemoteServer=log4cplus::SocketAppender
log4cplus.appender.RemoteServer.host=192.168.2.130
log4cplus.appender.RemoteServer.port=9000

log4cplus.appender.RemoteServer2=log4cplus::SocketAppender
log4cplus.appender.RemoteServer2.host=192.168.2.131
log4cplus.appender.RemoteServer2.port=9001

測試:

在Log4cplus的源碼包中,有一個loggingServer目錄,該目錄中實現了一個LoggingServer。

在編譯Log4cplus時,會自動編譯該目錄,在目錄中生成loggingServer可執行文件,當然可以自己make(需要依賴log4cplus庫)。

loggingServer使用方式如下:

./loggingserver 9000 log4cplus.properties

9000表示監聽的端口號(不需要地址,默認監聽本機地址)

log4cplus.properties是一個log4cplus的配置文件,和普通的log4cplus配置文件相同,loggingserver收到各個socket發來的日志后,根據配置文件信息,將其寫入文件。

服務端配置文件如下


log4cplus.rootLogger=TRACE, STDOUT, ALL_MSGS

#Appender輸出位置類型:控制臺輸出
log4cplus.appender.STDOUT=log4cplus::ConsoleAppender
#日志輸出格式 有詞法分析功能的模式布局器
log4cplus.appender.STDOUT.layout=log4cplus::PatternLayout
log4cplus.appender.STDOUT.layout.ConversionPattern=@@@[%d %d{%Z %Q}][pthread_id:%t][%l][%-5p][%c{2}] - %m%n

#Appender輸出位置類型有:文件輸出 設置日志追加到文件尾
log4cplus.appender.ALL_MSGS=log4cplus::RollingFileAppender
#設置輸出日志路徑
log4cplus.appender.ALL_MSGS.File=log/i1client.log
#設置日志文件大小
log4cplus.appender.ALL_MSGS.MaxFileSize=1024KB
#設置生成日志最大個數
log4cplus.appender.ALL_MSGS.MaxBackupIndex=20
#日志輸出格式 有詞法分析功能的模式布局器
log4cplus.appender.ALL_MSGS.layout=log4cplus::PatternLayout
log4cplus.appender.ALL_MSGS.layout.ConversionPattern=@@@[%d %d{%Z %Q}][pthread_id:%t][%l][%-5p][%c{2}] - %m%n
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9123

    瀏覽量

    85324
  • 內存
    +關注

    關注

    8

    文章

    3019

    瀏覽量

    74003
  • 程序
    +關注

    關注

    117

    文章

    3785

    瀏覽量

    81004
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73621
  • 日志
    +關注

    關注

    0

    文章

    138

    瀏覽量

    10639
收藏 人收藏

    評論

    相關推薦

    【龍芯2K0300蜂鳥板試用】tinnu-試用報告-基于以太網的CAN數據中繼模塊

    :k300_can2udp.7z 該程序給予C++11特性編寫,使用了log4cpp庫作為日志管理,rapidjson作為json解析,其他都是基礎語法從零編寫。 官方編譯鏈里面沒有 log4cpp
    發表于 09-01 22:51

    請問STM32F4與XMC4500各有什么優點優勢

    剛下完資料,還沒仔細看,想走下捷徑在這里問下先知們:STM32F4與XMC4500有沒有可比性?各有什么優點優勢?XMC4500集成了DSD模塊,不知道STM32有什么特色模塊?
    發表于 03-19 07:46

    LOG101,pdf(Precision Logarithm

    The LOG101 is a versatile integrated circuit that computeshe logarithm or log ratio of an input
    發表于 09-26 01:02 ?24次下載

    LOG102,pdf(Precision Logarithm

    The LOG102 is a versatile integrated circuit that computes the logarithm or log ratio of an input
    發表于 09-26 01:09 ?38次下載

    LOG112,LOG2112,pdf(Precision Logarithmic and Log Ratio Ampli

    The LOG112 and LOG2112 are versatile integrated circuits that compute the logarithm or log ratio
    發表于 09-26 01:10 ?38次下載

    LOG101/LOG104偏流調零電路

    LOG101/LOG104偏流調零電路 如圖所示為LOG101/LOG104的偏流調零電路。 LOG101/
    發表于 05-13 16:10 ?1561次閱讀
    <b class='flag-5'>LOG</b>101/<b class='flag-5'>LOG</b>104偏流調零電路

    使用Keysight免費評估Log4j/Log4Shell零日漏洞

    在過去72小時左右的時間里,網絡安全領域的大多數人已經意識到Log4j/Log4Shell零日漏洞及其對大多數web服務器、云應用程序、互聯網設備和嵌入式設備的廣泛影響。你可以閱讀CVE-2021-44228中記錄的所有血淋淋的細節,但底線是:這可能非常非常糟糕。
    的頭像 發表于 12-21 10:50 ?1532次閱讀

    3個開源庫讓單片機開發更簡單

    除了常用的log4c,log4cpp,下面給大家推薦3個非常不錯的開源日志庫,比較適合用在單片機的項目中。從開始的輕量,到后面的功能豐富,最后一個很強大,所以請耐心看到最后。
    的頭像 發表于 04-26 09:36 ?2154次閱讀

    Log4-detector Log4J漏洞版本掃描器

    log4j-detector.zip
    發表于 05-06 11:55 ?0次下載
    <b class='flag-5'>Log4</b>-detector <b class='flag-5'>Log4</b>J漏洞版本掃描器

    log4j-finder Log4Shell漏洞掃描工具

    log4j-finder.zip
    發表于 05-06 11:54 ?1次下載
    <b class='flag-5'>log4</b>j-finder <b class='flag-5'>Log4</b>Shell漏洞掃描工具

    fix_log4j2 log4j2漏洞緩解工具

    fix_log4j2.zip
    發表于 05-06 10:22 ?0次下載
    fix_<b class='flag-5'>log4</b>j2 <b class='flag-5'>log4</b>j2漏洞緩解工具

    推薦3個非常不錯的開源日志庫

    除了常用的log4c,log4cpp,下面給大家推薦3個非常不錯的開源日志庫,比較適合用在單片機的項目中。從開始的輕量,到后面的功能豐富,最后一個很強大,所以請耐心看到最后。
    的頭像 發表于 05-12 14:51 ?5123次閱讀

    log4j日志框架分析

    og4j是Apache下的一款開源的日志框架,能夠滿足我們在項目中對于日志記錄的需求。log4j提供了簡單的API調用,強大的日志格式定義以及靈活的擴展性。使用者可以自己定義Appender來滿足對于日志輸出的需求。在系統中對于記錄日志的需求并不單純。
    的頭像 發表于 02-28 14:32 ?1114次閱讀
    <b class='flag-5'>log4</b>j日志框架分析

    C#上位機開發(十三)之使用Log4net添加日志記錄功能

    一、Log4net 官方網站: 。 下載二進制dll庫:包中提供了針對各個版本的dll庫: 二、使用日志庫 1. 添加庫 復制對應的庫文件到項目中: 2. 配置log4net 2.1. 創建配置文件添加后修改該文件設置:
    發表于 05-29 16:25 ?1次下載
    C#上位機開發(十三)之使用<b class='flag-5'>Log4</b>net添加日志記錄功能

    基于Rust的Log日志庫介紹

    了一種簡單的方法來實現日志記錄,本文將介紹如何使用Rust的Log庫作為日志門面,并結合env_logger和log4rs兩個日志庫的實戰用例進行深入探討。 Rust的Log庫 Rust的Lo
    的頭像 發表于 09-19 14:49 ?3475次閱讀
    主站蜘蛛池模板: 老子午夜伦不卡电影院| 666永久视频在线| 日本无码免费久久久精品| 久久这里只有精品无码3D| 色欲国产麻豆一精品一AV一免费| 年轻夫妇韩剧中文版免费观看| 欧亚一卡二卡日本一卡二卡 | 东北老妇人70OLDMAN| 国产成人自产拍免费视频| 果冻传媒最新视频在线观看| 快播最新电影网站| 秋霞av伦理片在线观看| 婷婷亚洲五月色综合久久| 亚洲色爽视频在线观看| 456亚洲人成在线播放网站| 超碰在线97久久视频观看| 国产亚洲精品97在线视频一| 久久久GOGO无码啪啪艺术| 欧美兽交YOYO| 亚洲福利区| 91黄色影院| 国产精品一区二区四区 | 国产亚洲精品视频在线网| 久久精品九九亚洲精品天堂| 女人18毛片| 学生无码AV一区二区三区| 259luxu高跟黑色丝袜系列| 国产VA精品午夜福利视频| 久久艹伊人| 日韩在线中文字幕无码| 亚洲视频无码高清在线| 成3d漫二区三区四区| 好吊日视频在线| 青草视频久久| 亚洲精品色播一区二区| gogo免费在线观看| 娇妻在床上迎合男人| 日本久久久| 中文无码第3页不卡av| 国产乱人精品视频AV麻豆| 男女交性视频无遮挡全过程|