Log4cpp学习笔记

Log4cpp学习笔记
Log4cpp学习笔记

Log4cpp学习笔记

1 Log4cpp简介

Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。其类似的支持库还包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等。

Log4cpp有如下优点:

1. 提供了可扩展的多种日志记录方式;

2. 提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试;

3. 提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级;

4. 可通过配置文件完成所有配置并动态加载;

5. 性能优秀,内存占用小,经过编译后的log4cpp.dll大小仅有160kb;

6. 代码级的平台无关性,Log4cpp源代码经过编译后,适用于大多数主流的操作系统和开发工具;

7. 概念清晰,学习和使用方便,熟练程序员一天之内即可很好地应用log4cpp 进行开发。

2 Log4cpp组成

Log4cpp中的概念继承自log4j,最重要的是Category(种类)、Appender(附加目的地)和Layout(布局)三个概念,此外还有Priority(优先级)和NDC(嵌套的诊断上下文)等。

layout类控制输出信息的格式和样式。你可以使你的类基于layout,来指定你想要的输出数据的风格。log4cpp自带两个layout类。分别是SimpleLayout和BasicLayout。

appender类用来输出信息到设备上。这些信息已经被layout对象格式化过了。设备可以是标准输出,一个文件或者一个string buffer。你可以得到你自己的appender类如果你想要在一个socket,共享内存缓冲区或者其他一些写延迟设备。loc4cpp自带了3个非常有用的appender类。分别是FileAppender,OstreamAppender,和StringQueueAppender。

category类,Apender 和它的优先级是category的重要组成部分。优先级控制那些可以被特定类记录的日志消息。当category对象被创建时,它会构造一个默认的标准输出的appender,和一个默认的优先级。可以在记录日志的目标列表中添加更多的appender。可以通过NOTSET,DEBUG,INFO,NOTICE,WARN,ERROR,CRIT,ALERT或者FATAL/EMERG,按照递增顺序或者重要等级来设置日志信息。每条信息都被记录到category对象。而消息本身也有一个优先级。如果消息的优先级更高或者与category的优先级相同,记录日志就会发生,否则这条消息会被忽略。category

的优先级顺序如下:NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG。

Priority被用来指定Category的优先级和日志的优先级,NDC则是一种用来区分不同场景中交替出现的日志的手段。

Log4cpp记录日志的原理如下:每个Category都有一个优先级,该优先级可以由setPriority方法设置,或者从其父Category中继承而来。每条日志也有一个优先级,当Category记录该条日志时,若日志优先级高于Category的优先级时,该日志被记录,否则被忽略。系统中默认的优先级等级如下:

typedef enum ...{EMERG = 0,

FATAL = 0,

ALERT = 100,

CRIT = 200,

ERROR = 300,

WARN = 400,

NOTICE = 500,

INFO = 600,

DEBUG = 700,

NOTSET = 800

} PriorityLevel;

注意:取值越小,优先级越高。例如一个Category的优先级为101,则所有EMERG、FATAL、ALERT日志都可以记录下来,而其他则不能。

Category、Appender和Layout三者的关系如下:系统中可以有多个Category,它们都是继承自同一个根,每个Category负责记录自己的日志;每个Category可以添加多个Appender,每个Appender指定了一个日志的目的地,例如文件、字符流或者Windows日志,当Category记录一条日志时,该日志被写入所有附加到此Category的Appender;每个Append都包含一个Layout,该Layout定义了这个Appender上日志的格式。

Log4cpp日志记录原理图

3 一个日志记录应用程序的流程

手动使用log4cpp的基本步骤如下:

1.实例化一个layout 对象;

2.初始化一个appender 对象;

3.把layout对象附着在appender对象上;

4.调用log4cpp::Category::getInstance("name"). 实例化一个category

对象;

5.把appender对象附到category上(根据additivity的值取代其他

appender或者附加在其他appender后)。

6.设置category的优先级;

7.记录日志;

8.关闭Category.

9.// FileName: test_log4cpp1.cpp

// Test log4cpp by manual operation.

// Announce: use as your own risk.

// Compile : g++ -otest1 -llog4cpp test_log4cpp1.cpp

// Run : ./test1

// Tested : RedHat 7.2 log4cpp0.3.4b

// Author : liqun (liqun@https://www.360docs.net/doc/4d14827201.html,)

// Data : 2003-6-27

#include "log4cpp/Category.hh"

#include "log4cpp/FileAppender.hh"

#include "log4cpp/BasicLayout.hh"

int main(int argc, char* argv[])

{

// 1实例化一个layout 对象

log4cpp::Layout* layout =

new log4cpp::BasicLayout();

// 2. 初始化一个appender 对象

log4cpp::Appender* appender = new

log4cpp::FileAppender("FileAppender",

"./test_log4cpp1.log");

// 3. 把layout对象附着在appender对象上

appender->setLayout(layout);

// 4. 实例化一个category对象

log4cpp::Category& warn_log =

log4cpp::Category::getInstance("mywarn");

// 5. 设置additivity为false,替换已有的appender

warn_log.setAdditivity(false);

// 5. 把appender对象附到category上

warn_log.setAppender(appender);

// 6. 设置category的优先级,低于此优先级的日志不被记录

warn_log.setPriority(log4cpp::Priority::WARN);

// 记录一些日志

warn_https://www.360docs.net/doc/4d14827201.html,("Program info which cannot be wirten");

warn_log.debug("This debug message will fail to write");

warn_log.alert("Alert info");

// 其他记录日志方式

warn_log.log(log4cpp::Priority::WARN, "This will be a logged

warning");

log4cpp::Priority::PriorityLevel priority;

bool this_is_critical = true;

if(this_is_critical)

priority = log4cpp::Priority::CRIT;

else

priority = log4cpp::Priority::DEBUG;

warn_log.log(priority,"Importance depends on context");

warn_log.critStream() << "This will show up << as "

<< 1 << " critical message"

<< log4cpp::CategoryStream::ENDLINE;

//关闭Category.

log4cpp::Category::shutdown();

return 0;

}

4 Layout(布局)

首先回顾一下HelloWorld的日志格式,它使用了最简单的BasicLayout:1248337987 ERROR : Hello log4cpp in a Error Message!

1248337987 WARN : Hello log4cpp in a Warning Message!

上面的日志格式还可以,但显然不是许多程序员心中理想的格式,许多人理想的格式应该是这样的:

2009-07-24 15:59:55,703: INFO infoCategory : system is running

2009-07-24 15:59:55,703: WARN infoCategory : system has a warning

2009-07-24 15:59:55,703: ERROR infoCategory : system has a error, cant find a file 2009-07-24 15:59:55,718: FATAL infoCategory : system has a fatal error, must be shutdown

2009-07-24 15:59:55,718: INFO infoCategory : system shutdown, you can find some information in system log

要获得上面的格式,必须使用比BasicLayout复杂的PatternLayout,而且要花一个小时来熟悉一下PatternLayout的格式定义方式,如果你认为值得的话

4.1 PatternLayout

在介绍PatternLayout以前,首先来看看log4cpp中所有的Layout子类(Layout 本身是个虚类),一共三个:BasicLayout、PatternLayout和SimpleLayout,其中SimapleLayout并不建议使用,而BaiscLayout过于简单,因此如果程序员不自己扩展Layout的话,就只能使用PatternLayout了,值得庆幸的是,PatternLayout 还是比较好用的。

PatternLayout使用setConversionPattern函数来设置日志的输出格式。该函数的声明如下:

void log4cpp::PatternLayout::setConversionPattern ( const std::string & conversionPattern ) throw (ConfigureFailure) [virtual]

其中参数类型为std::string,类似于C语言中的printf,使用格式化字符串来描述输出格式,其具体含义如下:

%c category;

%d 日期;日期可以进一步的设置格式,用花括号包围,例如%d{%H:%M:%S,%l} 或者%d{%d %m %Y %H:%M:%S,%l}。如果不设置具体日期格式,则如下默认格式被使用“Wed Jan 02 02:03:55 1980”。日期的格式符号与ANSI C函数strftime 中的一致。但增加了一个格式符号%l,表示毫秒,占三个十进制位。

%m 消息;

%n 换行符,会根据平台的不同而不同,但对于用户透明;

%p 优先级;

%r 自从layout被创建后的毫秒数;

%R 从1970年1月1日0时开始到目前为止的秒数;

%u 进程开始到目前为止的时钟周期数;

%x NDC。

因此,要得到上述的理想格式,可以将setConversionPattern的参数设置为“%d: %p %c %x: %m%n”,其具体含义是“时间: 优先级Category NDC: 消息换行”。

因此,要得到上述的理想格式,可以将setConversionPattern的参数设置为“%d: %p %c %x: %m%n”,其具体含义是“时间: 优先级Category NDC: 消息换行”。使用PatternLayout的例子程序如下,项目名称是LayoutExam:#include

#include log4cpp/Category.hh>

#include log4cpp/OstreamAppender.hh>

#include log4cpp/Priority.hh>

#include log4cpp/PatternLayout.hh>

using namespace std;

int main(int argc, char* argv[])

...{

log4cpp::OstreamAppender* osAppender = new log4cpp::OstreamAppender("osAppender", &cout);

log4cpp::PatternLayout* pLayout = new log4cpp::PatternLayout();

pLayout->setConversionPattern("%d: %p %c %x: %m%n");

osAppender->setLayout(pLayout);

log4cpp::Category& root = log4cpp::Category::getRoot();

log4cpp::Category& infoCategory = root.getInstance("infoCategory");

infoCategory.addAppender(osAppender);

infoCategory.setPriority(log4cpp::Priority::INFO);

https://www.360docs.net/doc/4d14827201.html,("system is running");

infoCategory.warn("system has a warning");

infoCategory.error("system has a error, can"t find a file");

infoCategory.fatal("system has a fatal error,must be shutdown");

https://www.360docs.net/doc/4d14827201.html,("system shutdown,you can find some information in system log");

log4cpp::Category::shutdown();

return 0;

}

其运行结果即如下所示:

2009-07-24 15:59:55,703: INFO infoCategory : system is running

2009-07-24 15:59:55,703: WARN infoCategory : system has a warning

2009-07-24 15:59:55,718: FATAL infoCategory : system has a fatal error, must be shutdown

2009-07-24 15:59:55,718: INFO infoCategory : system shutdown, you can find some information in system log

5 Appender

笔者认为Appender是log4cpp中最精彩的一个部分。我仔细阅读了大部分Appender的源代码并对设计者感到非常敬仰。Log4cpp中所有可直接使用的Appender列表如下:

log4cpp::IdsaAppender // 发送到IDS或者

log4cpp::FileAppender // 输出到文件

log4cpp::RollingFileAppender // 输出到回卷文件,即当文件到达某个大小后回卷

log4cpp::OstreamAppender // 输出到一个ostream类

log4cpp::RemoteSyslogAppender // 输出到远程syslog服务器

log4cpp::StringQueueAppender // 内存队列

log4cpp::SyslogAppender // 本地syslog

log4cpp::Win32DebugAppender // 发送到缺省系统调试器

log4cpp::NTEventLogAppender // 发送到win 事件日志

其中SyslogAppender和RemoteSyslogAppender需要与Syslog配合使用,因此这里不介绍。顺便提一句,Syslog是类Unix系统的一个核心服务,用来提供日志服务,在Windows系统中并没有直接提供支持,当然可以用相关工具提供Windows系统中的syslog服务。

IdsaAppender的功能是将日志写入Idsa服务,这里也不介绍。因此主要介绍以下Appender:

log4cpp::FileAppender // 输出到文件

log4cpp::RollingFileAppender // 输出到回卷文件,即当文件到达某个大小后回卷

log4cpp::OstreamAppender // 输出到一个ostream类

log4cpp::StringQueueAppender // 内存队列

log4cpp::Win32DebugAppender // 发送到缺省系统调

log4cpp::NTEventLogAppender // 发送到win 事件日志

5.1 OstreamAppender

在我刚刚学习C/C++编程时,一位老师告诉我,如果没有好用的调试工具,就在代码中加入printf语句,将调试信息打印出来(当时在linux下面,确实没有什么易用的c++调试工具)。现在有了OstreamAppender,一切都好办了,它可以将日志记入一个流,如果该流恰好是cout,则会在标准控制台上输出。比printf 优越的是,除了输出消息外,还可以轻松的输出时间、时钟数、优先级等大量有用信息。

OstreamAppender的使用非常简单,在前面的HelloWorld程序中已经见过,创建一个OstreamAppender的具体方法如下:

log4cpp::OstreamAppender* osAppender = new log4cpp::OstreamAppender("osAppender", &cout);

第一个参数指定OstreamAppender的名称,第二个参数指定它关联的流的指针。

5.2 StringQueueAppender

后来一位高手又告诉我“在调试多线程程序时,不能随意使用printf”。因为printf导致IO中断,会使得本线程挂起,其花费的时间比一条普通指令多数千倍,若多个线程同时运行,则严重干扰了线程间的运行方式。所以调试多线程程序时,最好是将所有调试信息按顺序记入内存中,程序结束时依次打印出来。为此当时我们还写了一个小工具,没想到时隔多年,我碰上了StringQueueAppender。

我很怀疑StringQueueAppender被设计出来就是用于记录多线程程序或者实时程序的日志,虽然log4cpp的文档中并没有明确指出这一点。StringQueueAppender的功能是将日志记录到一个字符串队列中,该字符串队列使用了STL中的两个容器,即字符串容器std::string和队列容器std::queue,具体如下:

std::queuestd::string> _queue;

_queue变量是StringQueueAppender类中用于具体存储日志的内存队列。StringQueueAppender的使用方法与OstreamAppender类似,其创建函数只接收一个参数“名称”,记录完成后需要程序员自己从队列中取出每条日志,例子程序StringQueueAppenderExam如下:

#include iostream>

#include log4cpp/Category.hh>

#include log4cpp/OstreamAppender.hh>

#include log4cpp/BasicLayout.hh>

#include log4cpp/Priority.hh>

#include log4cpp/StringQueueAppender.hh>

using namespace std;

int main(int argc, char* argv[])

{

log4cpp::StringQueueAppender* strQAppender = new

log4cpp::StringQueueAppender("strQAppender");

strQAppender->setLayout(new log4cpp::BasicLayout());

log4cpp::Category& root = log4cpp::Category::getRoot();

root.addAppender(strQAppender);

root.setPriority(log4cpp::Priority::DEBUG);

root.error("Hello log4cpp in a Error Message!");

root.warn("Hello log4cpp in a Warning Message!");

coutmessage from Memory Queue!" cout queue>& myStrQ = strQAppender->getQueue();

while(!myStrQ.empty())

{

cout.front();

myStrQ.pop();

}

log4cpp::Category::shutdown();

return 0;

}

程序输出为:

Get message from Memory Queue!

1248839389 ERROR : Hello log4cpp in a Error Message!

1248839389 W ARN : Hello log4cpp in a Warning Message!

5.3 FileAppender和RollingFileAppender

FileAppender和RollingFileAppenderppender是log4cpp中最常用的两个Appender,其功能是将日志写入文件中。它们之间唯一的区别就是前者会一直在文件中记录日志(直到操作系统承受不了为止),而后者会在文件长度到达指定值时循环记录日志,文件长度不会超过指定值(默认的指定值是10M byte)。

FileAppender的创建函数如下:

/**

Constructs a FileAppender.

@param name the name of the Appender.

@param fileName the name of the file to which the Appender has

to log.

@param append whether the Appender has to truncate the file or

just append to it if it already exists. Defaults to "true".

@param mode file mode to open the logfile with. Defaults to 00644.

**/

FileAppender(const std::string& name, const std::string& fileName,

bool append = true, mode_t mode = 00644);

一般仅使用前两个参数,即“名称”和“日志文件名”。第三个参数指示是否在日志文件后继续记入日志,还是清空原日志文件再记录。第四个参数说明文件的打开方式。

RollingFileAppender的创建函数如下:

RollingFileAppender(const std::string& name,

const std::string& fileName,

size_t maxFileSize = 10*1024*1024,

unsigned int maxBackupIndex = 1,

bool append = true,

mode_t mode = 00644);

它与FileAppender的创建函数很类似,但是多了两个参数:maxFileSize指出了回滚文件的最大值;maxBackupIndex指出了回滚文件所用的备份文件的最大个数。所谓备份文件,是用来保存回滚文件中因为空间不足未能记录的日志,备份文件的大小仅比回滚文件的最大值大1kb。所以如果maxBackupIndex取值为3,则回滚文件(假设其名称是rollwxb.log,大小为100kb)会有三个备份文件,其名称分别是rollwxb.log.1,rollwxb.log.2和rollwxb.log.3,大小为101kb。另外要注意:如果maxBackupIndex取值为0或者小于0,则回滚文件功能会失效,其表现如同FileAppender一样,不会有大小的限制。这也许是一个bug。

例子程序FileAppenderExam如下:

#include iostream>

#include log4cpp/Category.hh>

#include log4cpp/Appender.hh>

#include log4cpp/FileAppender.hh>

#include log4cpp/Priority.hh>

#include log4cpp/PatternLayout.hh>

#include log4cpp/RollingFileAppender.hh>

using namespace std;

int main(int argc, char* argv[])

{

log4cpp::PatternLayout* pLayout1 = new log4cpp::PatternLayout();

pLayout1->setConversionPattern("%d: %p %c %x: %m%n");

log4cpp::PatternLayout* pLayout2 = new log4cpp::PatternLayout();

pLayout2->setConversionPattern("%d: %p %c %x: %m%n");

log4cpp::Appender* fileAppender = new log4cpp::FileAppender("fileAppender","wxb.log");

fileAppender->setLayout(pLayout1);

log4cpp::RollingFileAppender* rollfileAppender = new log4cpp::RollingFileAppender(

"rollfileAppender","rollwxb.log",5*1024,1);

rollfileAppender->setLayout(pLayout2);

log4cpp::Category& root = log4cpp::Category::getRoot().getInstance("RootName");

root.addAppender(fileAppender);

root.addAppender(rollfileAppender);

root.setPriority(log4cpp::Priority::DEBUG);

for (int i = 0; i 100; i++)

{

string strError;

ostringstream oss;

oss strError = oss.str();

root.error(strError);

}

log4cpp::Category::shutdown();

return 0;

}

程序运行后会产生两个日志文件wxb.log和rollwxb.log,以及一个备份文件rollwxb.log.1。wxb.log的大小为7kb,记录了所有100条日志;rollwxb.log大小为2kb,记录了最新的22条日志;rollwxb.log.1大小为6kb,记录了旧的78条日志。

5.4 Win32DebugAppender

Win32DebugAppender是一个用于调试的Appender,其功能是向Windows的调试器中写入日志,目前支持MSVC和Borland中的调试器。创建Win32DebugAppender仅需要一个参数“名称”,其使用非常简单,下面是例子代码DebugAppenderExam:

#include iostream>

#include log4cpp/Category.hh>

#include log4cpp/Appender.hh>

#include log4cpp/Win32DebugAppender.hh>

#include log4cpp/Priority.hh>

#include log4cpp/PatternLayout.hh>

using namespace std;

int main(int argc, char* argv[])

{

log4cpp::PatternLayout* pLayout1 = new log4cpp::PatternLayout();

pLayout1->setConversionPattern("%d: %p %c %x: %m%n");

log4cpp::Appender* debugAppender = new log4cpp::Win32DebugAppender("debugAppender");

debugAppender->setLayout(pLayout1);

log4cpp::Category& root = log4cpp::Category::getRoot().getInstance("RootName");

root.addAppender(debugAppender);

root.setPriority(log4cpp::Priority::DEBUG);

root.error("Root Error Message!");

root.warn("Root Warning Message!");

log4cpp::Category::shutdown();

return 0;

}

5.5 NTEventLogAppender

该Appender可以将日志发送到windows的日志,在运行程序后可以打开windows 的计算机管理?系统工具?事件查看器?应用程序,可以看到下图,注意图中第一行和第二行的两个日志。

例子程序NTAppenderExam如下:

#include

#include log4cpp/Category.hh>

#include log4cpp/Appender.hh>

#include log4cpp/NTEventLogAppender.hh>

#include log4cpp/Priority.hh>

#include log4cpp/PatternLayout.hh>

using namespace std;

int main(int argc, char* argv[])

{

log4cpp::PatternLayout* pLayout1 = new log4cpp::PatternLayout();

pLayout1->setConversionPattern("%d: %p %c %x: %m%n");

log4cpp::Appender* ntAppender = new log4cpp::NTEventLogAppender("debugAppender","wxb_ntlog");

ntAppender->setLayout(pLayout1);

log4cpp::Category& root = log4cpp::Category::getRoot().getInstance("RootName");

root.addAppender(ntAppender);

root.setPriority(log4cpp::Priority::DEBUG);

root.error("Root Error Message!");

root.warn("Root Warning Message!");

log4cpp::Category::shutdown();

return 0;

}

6 Category

Log4cpp中有一个总是可用并实例化好的Category,即根Category。使用log4cpp::Category::getRoot()可以得到根Category。在大多数情况下,一个应用程序只需要一个日志种类(Category),但是有时也会用到多个Category,此时可以使用根Category的getInstance方法来得到子Category。不同的子Category用于不同的场合。一个简单的例子CategoryExam如下所示:

#include iostream>

#include log4cpp/Category.hh>

#include log4cpp/OstreamAppender.hh>

#include log4cpp/FileAppender.hh>

#include log4cpp/BasicLayout.hh>

#include log4cpp/Priority.hh>

using namespace std;

int main(int argc, char* argv[])

{

log4cpp::OstreamAppender* osAppender1 = new log4cpp::OstreamAppender("osAppender1", &cout);

osAppender1->setLayout(new log4cpp::BasicLayout());

log4cpp::OstreamAppender* osAppender2 = new

log4cpp::OstreamAppender("osAppender2", &cout);

osAppender2->setLayout(new log4cpp::BasicLayout());

log4cpp::Category& root = log4cpp::Category::getRoot();

root.setPriority(log4cpp::Priority::DEBUG);

log4cpp::Category& sub1 = root.getInstance("sub1");

sub1.addAppender(osAppender1);

sub1.setPriority(log4cpp::Priority::DEBUG);

sub1.error("sub error");

log4cpp::Category& sub2 = root.getInstance("sub2");

sub2.addAppender(osAppender2);

sub2.setPriority(101);

sub2.warn("sub2 warning");

sub2.fatal("sub2 fatal");

sub2.alert("sub2 alert");

sub2.crit("sub2 crit");

log4cpp::Category::shutdown();

return 0;

}

运行结果如下:

1248869982 ERROR sub1 : sub error

1248869982 FATAL sub2 : sub2 fatal

1248869982 ALERT sub2 : sub2 alert

这个例子中共有三个Category,分别是根、sub1和sub2,其中sub1记录了一条日志,

sub2记录了两条日志。Sub2另外两个日志由于优先级不够未能记录。

7 NDC

NDC是nested Diagnostic Context的缩写,意思是“嵌套的诊断上下文”。NDC 是一种用来区分不同源代码中交替出现的日志的手段。当一个服务端程序同时记录好几个并行客户时,输出的日志会混杂在一起难以区分。但如果不同上下文的日志入口拥有一个特定的标识,则可以解决这个问题。NDC就是在这种情况下发挥作用。注意NDC是以线程为基础的,每个线程拥有一个NDC,每个NDC 的操作仅对执行该操作的线程有效。

NDC的几个有用的方法是:push、pop、get和clear。注意它们都是静态函数:Push可以让当前线程进入一个NDC,如果该NDC不存在,则根据push的参数创建一个NDC并进入;如果再调用一次push,则进入子NDC;Pop可以让当前线程从上一级NDC中退出,但是一次只能退出一级。Clear可以让当前线程从所有嵌套的NDC中退出。Get可以得到当前NDC的名字,如果有嵌套,则不同级别之间的名字用空格隔开。

一个简单的例子NDCExam如下:

#include iostream>

#include log4cpp/NDC.hh>

using namespace log4cpp;

int main(int argc, char** argv) ...{

std::cout "1. empty NDC: " NDC::get() std::endl;

NDC::push("context1");

std::cout "2. push context1: " NDC::get() std::endl;

NDC::push("context2");

std::cout "3. push context2: " NDC::get() std::endl;

NDC::push("context3");

std::cout "4. push context3: " NDC::get() std::endl;

std::cout "5. get depth: " NDC::getDepth() std::endl;

std::cout "6. pop: " NDC::pop() std::endl;

std::cout "7. after pop:"NDC::get()std::endl;

NDC::clear();

std::cout "8. clear: " NDC::get() std::endl;

return 0;

}

该例子来自log4cpp的例子程序,我做了简单的修改。在记录日志的时候,可以从NDC中得知当前线程的嵌套关系。

8 Log4cpp的自动内存管理

8.1 项目的多线程设置

VC中必须将项目设置为Debug MultiThreaded DLL,总之这个设置必须与你使用的Log4cpp库一致。如果你使用的是Release版本的log4cpp.dll,则应该设置为MultiThreaded DLL。否则在程序结束时会报错,报错处的调用堆栈为:

log4cpp::BasicLayout::`vector deleting destructor"(unsigned int 1) + 122 bytes

log4cpp::LayoutAppender::~LayoutAppender() line 21 + 35 bytes

log4cpp::OstreamAppender::~OstreamAppender() line 28 + 15 bytes

log4cpp::OstreamAppender::`vector deleting destructor"(unsigned int 1) + 103 bytes

log4cpp::Category::removeAllAppenders() line 159 + 39 bytes

log4cpp::HierarchyMaintainer::shutdown() line 101 + 27 bytes

log4cpp::HierarchyMaintainer::~HierarchyMaintainer() line 36

8.2 Log4cpp的内存对象管理

也许读者已经注意到,在前面的所有代码中,log4cpp中所有动态分配的对象都没有手动释放。

Log4cpp中new出来的Category、Appender和Layout都不需要手动释放,因为Log4cpp使用了一个内部类来管理这些对象。此类的名称是HierarchyMaintainer,它负责管理Category的继承关系,在程序结束时,HierarchyMaintainer会依次释放所有Category,而Category则会依次释放拥有的有效Appender,Appender则会释放所有附属的Layout。如果程序员手动释放这些对象,则会造成内存报错。

从下面的代码可以看出这个特征:

appender->setLayout(new log4cpp::BasicLayout());

这个new出来的BasicLayout根本就没有保存其指针,所以它只能被log4cpp的内存管理类HierarchyMaintainer释放。

了解到HierarchyMaintainer的内存管理方法后,程序员在使用log4cpp时应该遵循以下几个使用原则:

1. 不要手动释放Category、Appender和Layout;

2. 同一个Appender不要加入多个Category,否则它会被释放多次从而导致程序崩溃;

3. 同一个Layout不要附着到多个Appender上,否则也会被释放多次导致程序崩溃;

8.3 log4cpp::Category::shutdown()

在不使用log4cpp时可调用log4cpp::Category::shutdown(),其功能如同HierarchyMaintainer的内存清理。但如果不手动调用,在程序结束时HierarchyMaintainer会调用Category的析构函数来释放所有Appender。

9 利用配置文件定制日志

如同log4j一样,log4cpp也可以读取配置文件来定制Category、Appender 和Layout对象。其配置文件格式基本类似于log4j,一个简单的配置文件log4cpp.conf例子如下(来自log4cpp的API手册):

# a simple test config

log4j.rootCategory=DEBUG, rootAppender

log4j.category.sub1=A1

log4j.category.sub2=INFO

log4j.category.sub1.sub2=ERROR, A2

log4j.appender.rootAppender=org.apache.log4j.ConsoleAppender

https://www.360docs.net/doc/4d14827201.html,yout=org.apache.log4j.BasicLayout

log4j.appender.A1=org.apache.log4j.FileAppender

log4j.appender.A1.fileName=A1.log

https://www.360docs.net/doc/4d14827201.html,yout=org.apache.log4j.BasicLayout

log4j.appender.A2=org.apache.log4j.ConsoleAppender

https://www.360docs.net/doc/4d14827201.html,yout=org.apache.log4j.PatternLayout

https://www.360docs.net/doc/4d14827201.html,yout.ConversionPattern=The message %m at time %d%n

这是一个标准的java属性文件。读取配置文件要依赖PropertyConfigurator 和SimpleConfigurator类。这里仅介绍PropertyConfigurator,其使用方法代码ConfigFileExam所示(该代码来自《便利的开发工具-log4cpp快速使用指南》一文):

#include iostream>

#include log4cpp/Category.hh>

#include log4cpp/PropertyConfigurator.hh>

int main(int argc, char* argv[])

...{

try

...{

log4cpp::PropertyConfigurator::configure("./log4cpp.conf");

}

catch(log4cpp::ConfigureFailure& f)

NETFLOW配置及软件

一、测试环境介绍 1、硬件1台6509交换机,1台3745路由器 IOS (tm) c6sup2_rp Software (c6sup2_rp-JS-M), Version 12.1(22)E6, RELEASE SOFTWARE (fc1) System image file is "disk0:c6sup22-js-mz.121-22.E6.bin" IOS (tm) 3700 Software (C3745-IS-M), Version 12.2(13)T5, RELEASE SOFTWARE (fc1) System image file is "flash:c3745-is-mz.122-13.T5.bin" 2、软件solarwinds NetFlow Traffic Analysis 3.0、 ManageEngine_NetFlowAnalyzer_7002、 二、硬件配置 1、NETFLOW配置文档。 2、6509配置 mls netflow mls flow ip destination-source mls nde sender version 5 (我们的设备只有版本5) ip flow-export source Loopback0 (如果有L0接口用其他接口也可以) ip flow-export version 5 ip flow-export destination 192.168.4.165 2055 (2055是SOLAR公司的NETFLOW端口,9996端口是manangeengine公司的端口。两个端口号都是UDP 协议) 到此配置结束通过下面命令显示配置结果 CAT6509_1#show mls nde Netflow Data Export enabled Exporting flows to 192.168.4.165 (2055) Exporting flows from 218.30.64.33 (57965) Version: 5 Include Filter not configured Exclude Filter not configured Total Netflow Data Export Packets are: 612381 packets, 0 no packets, 16537978 records Total Netflow Data Export Send Errors: IPWRITE_NO_FIB = 0

CCNA安全笔记

CCNA Security笔记 Cisco ASA5500(VTM)集成了PIX、VPN3000、IPS功能 硬件IPS:(4240)入侵防护系统 CSA:基于主机的IPS 功能:限制用户行为,对应用程序进行控制 ISR增强特性:(ISR1800/2800/3825/3845) 1、无线模块 2、硬件IPS模块 3、Web Cache 4、NAM(网络分析模块) Role-based CLI views配置: 1、激活AAA:aaa new-model 2、配置enable secret:enable secret huda 3、进入Root View模式R1#enable view root Password:cisco 4、配置View“test”:R1(config)#parser view test定义用户 5、R1(config-view)#secret huda定义密码 6、R1(config-view)#command exec include ping定义可使用的命令

IOS安全保护,防止恶意删除,命令配置: Router(config)secret boot-image(加密隐藏保护IOS)Router(config)secret boot-config(加密备份配置) 注意:只有Console口才能禁用和恢复。 Rommon1>bootflash:c2800nm-adventerprisek9-mz.124.15. T5.bin Secure boot-config restore flash:/secure.cfg Router#copy flash:/secure.cfg running-config Cisco IOS Login Enhancements(防止恶意猜密码,DOS攻击)配置实例: Login block-for600attempts3with60(任何人60S内密码输错3次将挂起600S),只有permit用户不受这个限制 Login delay2 Login quiet-mode access-class block.ssh.new Login on-failure trap every3 Login on-success trap Ip access-list standard block.ssh.new Permit137.78.5.5

马克思世界历史理论的方法论意义概要

马克思世界历史理论的方法论意义 2013年11月18日09:40 来源:《中国社会科学》(京)2013年6期作者:马俊峰字号 打印纠错分享推荐浏览量103 内容摘要:马克思的世界历史理论是批判地继承了黑格尔的世界历史思想的合理因素,运用其创造的唯物史观及剩余价值理论深入研究了近代以来世界经济与社会的运动及其发展趋势而创立的。世界历史理论是马克思主义的重要内容,也是马克思分析研究许多问题的重要背景和方法,又构成了科学社会主义的重要理论基础。重新理解和解读马克思的世界历史理论,对于我们总结社会主义发展的历史经验,研究和处理全球化时代的诸多重要问题,尤其是处理好民族主体与人类主体的关系问题,建设中国特色社会主义,走好中国道路,都具有非常重要的方法论意义。 关键词:世界历史理论;全球化;现代化;人类解放 作者简介:马俊峰,中国人民大学哲学院教授。 世界历史理论是马克思批判地继承了黑格尔关于世界历史思想的 合理因素,运用其创造的唯物史观及剩余价值理论,深入研究近代以来经济与社会的运动及其发展趋势而创立的。马克思分析和讨论许多问题都是从世界历史的视野和高度进行的,不懂得或忽视这一点,在理解马克思的思想时势必会造成许多误解和曲解。在很长一个时期内,我们对于马克思世界历史理论及其重要意义认识不足,这是造成我们对于“什么是社会主义、如何建设社会主义”这个时代课题理论上“不太清楚”、实践上走了很多弯路的重要原因之一。面对经济全球化浪潮的巨大冲击,总结世界社会主义发展的历史经验、重新理解和谋划现代化方略以及建设中国特色社会主义的迫切需要,激活了世界历史理论这个重要思想资源,使之成为近年来我国马克思主义哲学研究的一个理论热点问题。显然,世界历史理论既是我们重新理解和解读马克思主义基本理论的重要切入点,也是显现马克思主义当代价值的重要方面。 一、马克思对黑格尔世界历史思想的创造性转换 马克思世界历史理论的直接思想渊源是黑格尔关于世界历史的思想,现实基础则是业已形成并日益扩大的国际贸易和世界市场及其产生的各种效应。在发生学的意义上,历史开始向世界历史转变是由地理大发现引起的国际贸易,尤其是由工业化所催动的国际市场拓展引发的。地理大发现不仅发现了美洲新大陆和澳大利亚等地区,开辟了通往东方的新航线,而且通过更加频繁的交往,使人们日益了解了“新世界”和东方国家的历史知识。正是在这个基础上,伏尔泰写出了《论各民族的风格与精神》,从最远古的中国讲起,把欧、亚、非、美几个大洲的国家和民族都写入历史,为后来世界史的编著开辟了道路。此后,一些历史学家致力于世界历史的著述,如J. C. 加特勒尔的《世界历史要览》、A. L. von施勒策尔的《世界历史概略》等等,英国J. 坎普贝尔等人还辑集了一部多达38卷的《自远古迄今的世界历史》。作为伟大的思想家,黑格尔基于一种“巨大的历史感”,并不满意这些历史学家把历史当作已经发生的经验事实进行堆积排列的做法,即只是依据一定的材料叙述历史中发生的行动、事变以及导致这些行动和事变发生的动机,

九年级世界历史知识点汇总

九年级世界历史知识点汇总 1、文艺复兴的意义: 文艺复兴推动了欧洲文化思想领域的繁荣,为欧洲资本主义社会的产生奠定了思想文化基础。是资产阶级叩响近代社会大门的思想解放运动,促进资本主义的发展。 2、新航路开辟的意义: a.新航路开辟使欧洲与亚洲、非洲、美洲联系日益密切,世界开始连成一个整体,是经济全球化的开始。打破了以往世界各个地区相互隔绝和孤立发展的局面。 b.促进欧洲资本主义的产生和发展 c.随着新航路的开辟,一场持续了数百年的殖民掠夺、扩张与侵略活动也从此开始了,欧洲资本主义的触角开始伸向世界各地。 3、英国资产阶级革命历史意义和影响: ①推翻了封建专制统治,走上了资本主义道路,率先开始了工业革命,有利于资本主义的发展②推动了欧洲资产阶级革命运动的发展③是世界近代史的开端 4、美国独立战争的历史意义: 既是民族解放战争,又是资产阶级革命;①推翻了英国的殖民统治,赢得了民族独立,走上了资本主义道路,开创了民主政治的先河,有利于美国资本主义的发展;②推动欧美资产阶级革命 5、法国大革命的历史意义: ①彻底摧毁了法国的封建统治,走上了资本主义道路,有利于资本主义的发

展,②使民主共和思想广为传播,③对人类社会的发展产生了深远影响。 6、评价拿破仑: 拿破仑是法国大革命时期杰出的资产阶级政治家和军事家,也是一个军事独裁者。他掌握政权后,采取各种措施发展资本主义工商业,制定和颁布了《法典》,确立了资本主义社会的立法规范。他所进行的早期战争捍卫了法国大革命的成果,动摇了欧洲大陆的封建统治,但后期进行的战争,侵犯了欧洲许多国家的主权,掠夺了各国人民的财富,激起了各国人民的反抗,最终葬送了法兰西第一帝国。 7、工业革命影响: ①生活方面:出现的交通工具方便了人们的出行,扩大了人类的活动范围,密切了世界各地的联系。 ②生产力:机器生产代替了手工,产生了巨大的生产力。 ③社会关系方面:使社会日益分裂为两大直接对立阶级,即工业资产阶级和工业无产阶级。 ④国际关系方面:资本主义最终战胜封建主义。率先完成工业革命的西方资本主义国家逐步确立起对世界的统治,世界形成了西方先进、东方落后的局面。 8、工业革命给中国带来了怎样的影响 (1)率先完成工业革命的英国对中国发动鸦片战争,中国开始沦为半殖民地半封建社会; (2)地主阶级洋务派向西方学习,掀起了洋务运动; 工业革命的启示:科技是第一生产力。坚持科教兴国战略、科学发展观。 9、俄国农奴制改革的意义: 积极影响:是沙皇自上而下实行的资产阶级性质的改革,废除农奴制,有利

马克思世界历史理论的方法论

马克思的世界历史理论的方法论意义 摘要:本文介绍了世界历史理论的基本观点,阐述了"世界历史"理论的基本方法,探究了马克思的世界历史理论的方法论意义。 关键词:形成时期;全球化;实践价值;基本观点;经济活动 在马克思主义形成时期,马克思就曾把他所处的时代概括为"历史转变为世界历史"的时代,现代世界非常突出的特点就是全球化,对全球化的认知决定了人类判断全球化和怎样参与全球化的出发点。马克思曾经对全球化的发生和发展以"世界历史"的理论形态作了概括和分析,掌握马克思关于全球化或者说"世界历史"分析的方法论,挖掘和研究这一思想的方法论意义,对于认识和把握全球化问题有重要的理论和实践价值。 一、"世界历史"理论的基本观点 马克思主义始终以揭示人类历史发展的总体过程作为自身的主要任务,虽然马克思没有系统的全球化理论,但他从全球视野阐发的"世界历史"的重要思想,为我们研究当代全球化问题奠定了科学的方法论基础。总体说,马克思关于"世界历史"的观点有三个方面: 1."世界历史"是生产力发展的必然过程。在马克思看来,世界历史的形成和发展并不是黑格尔所说的人类历史之外的什么"世界精神"的产物,而是以工业技术革命为代表的生产力自身运动的结果。世界市场使各个国家、民族连为一体,从而形成世界历史。 2."世界历史"是一种新的文明形成的过程。"世界历史"的形成不仅是经济活动世界化的过程,同时是精神层面世界化的过程。资产阶级把

消费与生产全球化,所有古老的关系以及与之相适应的素来被尊崇的观念都被瓦解了,一切国家人民之间的民族分隔和仇外心理在日益消失。由于生产与消费的全球化,文化也逐渐的全球化。"过去那种地方的和民族的自给自足和闭关自守状态,被各民族的各方面的互相往来和各方面的互相依赖所代替了。物质的生产是如此,精神生产也一样。 3.人的发展过程,就是"世界历史"。马克思历史观的出发点和落脚点是现实社会的人。,"世界历史"的发展就是现实的个人的发展。"人们的社会历史始终只是他们个体的历史,而不管人们是否意识到这点。"而"每一个单个人的解放的程度是与历史完全转变为世界历史的程度一致的"。 二、"世界历史"理论的基本方法论 马克思阐述的历史向"世界历史"转化的全球化过程是博大精深的,不仅作了经济学、政治学、历史学的分析,而且作了哲学、人类学、文化学的分析;不仅揭示了这个历史过程的本质,而且描述了这个过程的生动的现象;不仅是历史的,而且是逻辑的。透过马克思"世界历史"理论的丰富的内容,我们可以找出贯穿在其思想中的方法论。 1.价值观与历史观互相统一的方法。社会客观规律的尺度,就是历史尺度,马克思把人类社会看做为以生产力发展为基础的持续改变的历史过程。生产力标准是衡量社会进步的客观的基本的标准。这一点把马克思的唯物史观与形形色色的唯心史观从根本上区分开来。马克思又认为,历史是由有目的、有意志、有激情的人自觉创造的。马克思充分肯定资本主义生产方式在人类历史发展过程中的伟大的划时代

鲁教版八年级上世界历史

世界历史(八年级上) 第1课:人类的形成 1、人类形成的过程:攀树的正在形成中的人完全形成的人,包括:、 、、、 2、世界上的人类分为三大主要人种,即黄种、白种和黑种人。人种的差异,是不同环境等众多因素长期影响的结果。 3、人类在距今约形成。自从有了人类,也就有了人类社会的历史。人类历史上最早出现的社会是原始社会。 4、原始社会经历了和父系氏族社会。(母系——“只知其母,不知其父”,妇女在社会中占主导地位。父系——“既知其母,又知其父”,男子在经济中占主导地位) 第2课:大河流域——人类闻名的摇篮 1、世界上最古老的文明古国,有非洲的和亚洲的、和。这四个古国被称为世界文明的摇篮,因为这四个国家最先由进入。 2、约从年开始,在非洲的两岸陆续出现了几十个奴隶制小国。年左右,初步统一的国家建立起来。古代埃及权利的象征是金字塔。它们是古代埃及的文明标志之一,是人类文明的杰出成就。 3、在亚洲西部,有一条狭长地带,它形似一弯新月,土地肥沃,因此有之称。 4、公元世纪,国王统一了(今伊拉克一带),建立起中央集权的奴隶制国家,制定了一部维护利益的法典,汉谟拉比法典是世界现存古代第一部比较完备的法典。 5、约公元,流域开始出现奴隶制小国。古印度有着严格的等级制度,历史上称“” 第3课:西方文明之源 1、西方文明之源——。 2、公元,希腊半岛和出现建立的城邦,雅典是其中最重要的城邦之一。公元前世纪,雅典成为著名的奴隶制共和国。在统治时期,雅典达到全盛,经济繁荣,文化昌盛,发展到古代世界的高峰。(全体成年男性公民才有权参政) 3、年,罗马建立了。年,开始独揽大权,建立。后来罗马帝国分裂为西罗马帝国和东罗马帝国。西罗马帝国的灭亡(476年)标志着西欧的结束。 第4课:亚洲封建国家的建立 1、世纪,大和统一日本本土,最高统治者称天皇。 2、世纪日本仿照隋唐制度,进行。

部编版九上世界历史知识点梳理精校版

部编版九上世界历史知识梳理 第一单元古代亚非文明 第1课古代埃及 1、古埃及发源地:非洲东北角的尼罗河流域 2、古埃及的发展历程: (1)约从公元前3500年开始,出现了若干小国家 (2)公元前3100年,初步实现统一, (3)经历了古王国时代,中王国时代、新王国时代 (4)新王国时代法老图特摩斯三世统治时期,古埃及成为强大的军事帝国,地跨亚非。 (5)公元前525年,波斯帝国吞并古埃及,后来,亚历山大帝国和罗马帝国先后占领古埃及,古埃及文明没有延续下去。 3、金字塔是法老的陵墓,是古埃及文明的象征,反映了古埃及社会经济发展的较高水平,是古埃及人智 慧的结晶。 4、古埃及的最高统治者称为法老,集军、政、财、神等大权于一身。在宗教上,法老被认为是“神之子” 具有无上的权威。 5、古埃及的文明成就:政治上:建立奴隶制君主专制 文字:象形文字,是世界上最古老的文字之一 天文历法:太阳历,是世界最早的太阳历 医学:制作木乃伊 建筑雕塑:金字塔、狮身人面像 【注意】 1、古埃及的地理位置地图 2、金字塔图片、象形文字图片 第2课古代两河流域 1、古代两河流域发源地:亚洲西部的幼发拉底河和底格里斯河流域 古代两河流域的发展历程: (1)约从公元前3500年起,产生了一些以城市为中心的小国。 (2)约在公元前2400年,两河流域初步统一。 (3)古巴比伦王国时期,汉谟拉比建立了统一、强大的奴隶制国家。 2、古代两河流域的文明象征:文字:楔形文字 历法:阴历 算术:60进位制 律法:《汉谟拉比法典》 建筑:空中花园 3、《汉谟拉比法典》: (1)制定者:古巴比伦国王汉谟拉比 (2)目的:加强中央集权 (3)地位:是迄今已知世界上第一部较为完整的成文法典 (4)内容:①社会等级:分为拥有公民权的自由民、无公民权的自由民和奴隶三个严格的社会等级。 ②家庭奴隶制是古巴比伦的一大特征,奴隶主要来自战俘 ③经济领域:有关于租赁、雇佣、交换、借贷等方面的规定,商品经济在古巴比伦比较活 跃。 (5)实质:维护奴隶主阶级的利益 (6)影响:《汉谟拉比法典》是古巴比伦王国留给人类的宝贵文化遗产,表明人类社会的法制传统源远流长。是迄今已知世界上第一部较为完整的成文法典。 【注意】 1、古代两河流域的地理位置地图 2、楔形文字的图片、《汉谟拉比法典》石柱的图片

马克思的世界历史理论研究概述(一)

马克思的世界历史理论研究概述(一) 【正文】 马克思的世界历史理论是马克思在《1844年经济学哲学手稿》中首次提出,并分别在《德意志意识形态》和《共产党宣言》两书中较为系统地展开和表述的。这一理论提出以后的一百多年间,由于种种原因,长期被忽视,甚至成为历史唯物主义教科书的“盲点”和“空场”。90年代以来,随着冷战的结束,世界经济“一体化”或“全球化”的深入,特别是世界范围内经济文化落后国家对其本民族现代化发展道路的反思与探索,马克思的世界历史理论才逐渐引起人们的重视,并得到较为全面的研究和展开,并在以下方面取得共识:马克思的世界历史理论是马克思主义的历史哲学或唯物史观的核心组成部分,它不仅是马克思考察分析人类社会、建构唯物史观的方法论基础,同时也是他剖析、批判资本主义社会、建构未来社会和共产主义学说的理论根据。然而,由于我国理论界对这一理论研究较晚,在这一理论深入研究过程中,争论较多,总体上讲还是分歧大于共识,其主要表现为以下三个方面: 一、世界历史范围的涵义及其与民族史、地域史的关系 第一种观点认为:世界历史是一个整体范畴,它不是各民族历史的简单的总和,它是资本主义建立大工业以来各民族历史相互作用的产物。世界历史是由民族历史构成的统一整体,但它又有不同于民族历史个体运动规律的整体运动规律。因此世界历史与民族历史的关系,具有系统和要素之间的关系。 第二种观点认为:世界历史不是通常的历史学意义上的世界历史,即整个人类历史,而是特指各民族、国家通过普遍交往,进入相互依存状态,使世界整体化以来的历史。因为:世界历史虽存在于今天,但它却形成于近代,即资本主义时代。稍后这一观点稍有变化,认为马克思的世界历史概念具有两层含义:一是指人类总体历史。二是特指18—19世纪世界“一体化”以来的历史。但这种观点认为,马克思的社会发展理论中的世界历史概念主要指后者,世界历史形成之后,人类历史与民族历史的关系不再仅仅是一般和特殊的关系,而且同时具有了整体和部分的关系。 第三种观点认为:马克思的“世界历史”范畴与历史学学科意义上的世界历史范畴含义不同,两者不可混淆。首先,从时间上看,上限不同。马克思的世界历史范畴是特指16世纪资产阶级登上历史舞台以来世界作为一个整体所形成的历史。而历史学的世界历史,在时间上则包括了人类有史以来的全部历史。其次,从空间上看,其涵盖范围和意义上不同。马克思的世界历史范畴是以交往及其扩大所造成的世界性后果为特征,是指世界经济、政治和思想文化的一体化,即世界形成了有机整体。历史学的世界历史范畴则强调把全球各个民族和地区的历史包括在内,即在地域上包括全球。再次,从学科划分的级别上看,层次不同。马克思的世界历史范畴是一个哲学范畴,历史学的世界历史范畴是一个具体历史学科的范畴。 第四种观点认为:世界历史是一个多层次含义的范畴,在黑格尔时代,世界历史概念有两层含义:一是指在历史学、编纂学意义上的世界历史。它在空间上是指相对于民族史和地域史而言的世界史、全球史。它在时间上是包括人类有史以来的全部历史、总体历史。二是指由维柯以来到黑格尔所完成的哲学精神层面上的世界历史概念。从纯粹思想史的角度看,马克思又发掘出世界历史的第三层含义:即自18世纪以来,由资本主义生产和交往方式的迅猛发展而使世界成为统一整体、统一格局的历史。但同时这种观点又认为,当然,马克思并没有完全排斥上述两种世界历史观。相反,他的世界历史概念统率了前人的观点,并以前人的理解为基础,来阐明历史唯物主义的基本原理。 第五种观点认为:马克思的世界历史范畴有四层相互联系的含义。一是指人类历史发展的统一性及其共同基础。二是指各个民族和国家的生产力与生产关系的系统间的相互联系、相互作用的总体。三是专指资本主义世界历史时代。四是特指在资本主义发展的一定阶段上所产生的现实的共产主义运动及其结果。这种观点还特别强调指出:马克思的“世界历史”范畴这

八年级世界历史上册复习提纲

八年级世界历史上册复习提纲第2课:大河流域---人类文明的摇篮 古国名河流文明初现统一时间文明成果(或代表制度) 古埃及尼罗河约公元前3500年约公元前 3000 金字塔(法老的坟墓)胡夫 最大 古巴比伦幼发拉底 河、 底格里斯河 (伊拉克) 公元前3500年以 后 公元前18世 纪 《汉谟拉比法典》是世界现 存的古代第一部比较完备 的成文法典。目的是维护奴 隶主利益 古印度印度河约公元前2500年种姓制度,(婆—刹—吠— 首) 古中国黄河(母亲 河) 公元前2070年分封制司母戊鼎 注意:1、印度的种姓制度在现实生活中对哪个阶层最有利:答案刹帝利 2、归纳与古印度有关的文明:种姓制度、佛教、阿拉伯数字 3、大河文明和海洋文明的实质一样:都是奴隶制文明 4、古代四大文明古国:古埃及、古巴比伦、古印度、古埃及? 答案因为:他们较早由原始社会进入奴隶社会 5、中国的四大发明:造纸术(西汉)印刷术(隋唐)火药(唐朝) 指南针(北宋) 第3课:西方文明之源(海洋文明) 西 方 文 明 古 希 腊 雅典 1、公约前6世纪,成为著名的奴隶制共和国 2、公元前5世纪后半期,伯利克里当政期间雅 典民主政治发展达到最高峰。(最高权力机 构——公民大会) 伯利克里改革内容:(政治经济文化) 希腊文明最早出现在公元 前2000年,叫爱琴文明 (西方文明就发源于古希 腊) 斯巴达1、崇尚武力,施行严格的军事训练制度,犹如 一座大军营。

第四单元步入近代——世界近代史部分(开始于1860年英国资产阶级革命)

文 艺 复 兴 时间背景地区中心思潮实质代表人物作用 14世 纪前 后 地中海地 区生产关 系的发 展,资产 阶级兴起 意大利, 随后扩 展到欧 洲 人文主义: 要求以人为 中心,而不是 以神为中心; 提倡发扬个 性,追求现世 生活中的幸 福 新兴的资 产阶级文 化的兴起 但丁《神 曲》; 达芬奇《蒙 娜丽莎》、 《最后的晚 餐》; 莎士比亚 《罗密欧和 朱丽叶》 1、推动了欧洲文化思想 领域的繁荣 2、为欧洲资本主义社会 的产生奠定了思想文化 基础 发现“世界”和“人”的时代 新 航 路 的 开 辟 原因客观条件主要经过影响 1、欧洲 商品经 济的日 益发展 与扩大 2、西欧 国家“寻 金热” 1、指南针 的应用 2、地圆学 说的深入 人心 3、航海技 术的进步 航海家事迹支持国 家 1、世界开始连 成一个整体 2、欧洲大西洋 沿岸的工商业 经济繁荣起来, 促进了资本主 义的产生与发 展。 迪亚士绕过非洲最南端,进入 印度洋 葡萄牙 达·伽 马 到达印度,找到了通往 东方的新航路 葡萄牙 哥伦布到达美洲的古巴、海地 等 西班牙

高中历史人教版必修部分:世界历史各时期知识点总结总汇

世界历史各时期知识点总汇 古代希腊雅典民主政治:梭伦、克利斯提尼、伯里克利;人民主权、轮番而治、少数民主西方人文精神的起源:泰勒斯,智者学派,苏格拉底强调人的价值和作用,柏拉图,亚 里士多德 罗马法:《十二铜表法》:罗马第一部成文法;公民法;万民法;自然法 文艺复兴:人文主义;薄伽丘、莎士比亚;思想解放 西方人文宗教改革:马丁?路德;因信称义;打击天主教会势力 精神发展启蒙运动:理性主义;伏尔泰、孟德斯鸠、卢梭、康德;第三次思想解放运动开辟新航路:迪亚士→好望角;哥伦布→美洲 世界市场 荷兰、英国殖民扩张:建立海外商品市场;世界市场形成主要途径;日不落帝国逐步形成 工业革命:增强欧美国家的力量,列强瓜分世界,促进世界市场的最终形成英国君主立宪制的确立: 1689年《权利法案》;责任内阁制完善欧美代议制美国共和制的确立:1787年宪法:联邦、共和、总统制;第一部成文宪法确立与发展法国共和制的确立: 1875年法兰西第三共和国宪法;总统制 德意志帝国君主立宪制的确立: 1871年《德意志帝国宪法》;专制、军国主义 科学社会主义1848年《共产党宣言》:标志马克思主义的诞生理论和实践1871年巴黎公社:无产阶级建立政权的第一次伟大尝试 经典力学体系:牛顿的机械运动定律和万有引力定律——近代自然科学形成近代世界进化论:达尔文《物种起源》;冲击“神创说”科学技术 第一次工业革命:蒸汽时代第二次工业革命:电气时代 俄国十月革命:1917年,第一次社会主义革命,建立了第一个社会主义国家战时共产主义政策:余粮收集制;工业全部国有化;取消商品贸易 苏俄革命新经济政策:固定的粮食税;允许中小企业私营、外资经营;自由贸易和建设 斯大林模式:高度集中的政治经济体制,后期弊端严重,导致苏联解体赫鲁晓夫、勃涅日列夫、戈尔巴乔夫改革:没有突破斯大林摸式弊端→苏联解体背景:1929—1933资本主义世界经济危机 罗斯福新政罗斯福新政:金融、工业、农业、以工代赈、社会保障;特点:国家干预经济及影响二战后资本主义新变化:国家垄断资本主义;福利国家美苏两极对峙格局的形成:北约、华约组织的成立为标志 当今世界政治多极化趋势发展:欧共体形成;日本高速发展;中国振兴;不结盟运动格局的演变 两极格局瓦解和多极化趋势加强: 1991年苏联解体为标志 “布雷顿森林体系”的建立:美元为中心;资本主义世界经济体系的形成当今世界经济世界经济区域集团化:欧盟、北美自由贸易区、亚太经济合作组织的全球化趋势世界贸易组织:前身是关税及贸易总协定;中国于 2001年底加入 经济全球化:实质是发达国家主导的新一轮资本扩张;机遇和挑战并存 现代科技 爱因斯坦相对论和普朗克量子论:现代物理学的两大支柱 网络技术和现代信息技术:第三次科技革命标志成果;人类进入信息时代 现代世界( 1917 ——今) 近代世界 古代世界

netflow安装过程

Netflow安装步骤 一、安装linux 操作系统,安装是要把apche(www服务器)组件和development tools(编译安装工具)选上 二、部署flow-statcgi Flow-statcgi是一个基于flow-tools的browse/server结构(cgi)的NetFlow数据分析工具。 2.1cisco设备的设置 cisco设备的NetFlow支持,首先要培植cisco设备,使之产生NetFlow数据,输出到服务器的2055端口上。 2.2安装flow-tools 0.56 使用flow-tools来接收NetFlow数据,并保存成文件。 为了顺利编译flow-statcgi,要将flow-tools的源文件解压缩到/root下: 1.将flow-tools-0.56.tar.gz复制到服务器的/root目录下。 2.cd /root ; tar zxvf flow-tools-0.56.tar.gz ; cd flow-tools-0.56(这是三个命令用一行执行) 3../configure 4.make 5.make install 2.3安装apache server 使用apache server来做http服务器。 由于各apache server的配置不一样,在flow-statcgi中假设cgi-bin目录为/var/www/cgi-bin,www目录为/var/www/html。如果有变动,需要修改flow-statcgi.c中的“DEBUGFILENAME”、make_flow_cgi.sh中的“/var/www/cgi-bin/” 三、编译和安装flow-statcgi 3.1预处理 1.将flow-statcgi.c复制到/root/flow-tool-0.56/src/,将flow-statcgi.temple.html复制到/var/www/cgi-bin/(cgi所在目录),将flow-statcgi.log.html复制到 /var/www/html/(html所在目录),注意要在这里把flow-statcgi.log.html的属性 加个可写属性。 2.修改flow-statcgi.c中的“DEBUGFILENAME”(要改成html文件所在的位置)、“DataDir”(要改成flow-tool数据所在目录) 3.修改flow-statcgi.c中的“isip”部分,同时修改“ISIPCOUNT ”、“isipdesc”,“isip”。 详细说明见《Flow-statcgi使用说明》中的“预定义条件”。 3.2编译、安装 把make_flow_cgi.sh这个文件拷贝到/root目录下,修改make_flow_cgi.sh中的“/var/www/cgi-bin”为cgi所在目录。执行一下命令进行编译、安装“sh make_flow_cgi.sh flow-statcgi”,这样会在cgi目录下面生成一个flow-statcgi的cgi文件。其中编译之后会出现警告信息,可以忽略不管。 四、运行flow-tools 1.把startflowreceive.sh和starflowcapture.sh这两个shell命令文件拷到/root目录下2.执行“sh startflowreceive.sh”命令 3.执行“sh startflowcapture.sh”命令

7第七章:世界历史研究方法(乔荣生2016年9月20日)

马克思主义与社会科学方法论(理论视野部分) 世界历史理论的视野 ●本讲的三个问题: ●一、世界历史理论产生的实践逻辑是什么? ●二、如何理解世界历史理论的内涵及视角? ●三、学习世界历史理论有哪些方法论意义? 一、世界历史理论产生的实践逻辑是什么? ●1、世界历史形成前的历史事实:P254 ●自给自足的小生产,生产规模小,交通工具落后,彼此隔绝、孤立发展,家族和宗法,人对人的依赖关系等。 (奴隶) ●2、15、16世纪以来的历史事件:P252、255 ●新航路的开辟(地理大发现)——海外殖民地——机器大工业——社会化大生产——世界市场的形成——城市 化和全面交往——自由民主人权观念,物的依赖性基础上的人的独立性。(雇佣) ●3、思考:后者取代前者的人类实践遵循的逻辑是什么? ●1)生存——生活?(人的生活状况) ●2)农业——工业?(生产力的发展) ●3)血缘——雇佣?(人的自由状况) ●……(还有哪些逻辑?请同学们思考补充) ●4)这是不是人类历史的基本事实?如何认识这个事实?有哪些影响?(两重性P256) 3、世界历史发展的三个阶段P260 ●(1)以英国为中心:到二战后 ●(2)以美国为中心:到冷战后 ●(3)世界的多极化:以计算机网络为核心的信息技术革命,使地球成为了“地球村”,经济全球化、政治多极 化、文化多元化的时代。 ●4、如何认识经济全球化?P263-269(特点?矛盾?主导?处于人对物依赖的阶段?市场竞争的丛林法则,时 间长短?发展趋势?) 二、如何理解世界历史理论的内涵及视角? ●1、何谓“历史”?P248 ●(1)“实际发生的”历史 ●(2)历史学家们“写出来的”历史 ●(3)二者是何关系? ●2、黑格尔对“历史”的分类及局限(唯心主义):P 248-250 ●(1)原始的历史:受某地区和时代所限; ●(2)反省的历史:对历史有考察和反思; ●(3)哲学的历史:解释历史的同一本性。 ●3、马克思的世界历史理论:P251 ●(1)马克思在《1844年经济学哲学手稿》中对世界历史的理解:整个人类历史(同黑格尔); ●(2)马克思在《德意志意识形态》中对世界历史的理解:资本主义所开启的新的历史阶段,是人类历史发展 的一个特定阶段。(形态论:异质论取代黑格尔的同质论;劳动论:超越黑格尔的“精神劳动”;两大发现使社会主义由空想到科学等。) 三、学习世界历史理论有哪些方法论意义? ●1、帮助我们用世界眼光观照当代社会发展 ●2、帮助我们正确理解全球化与民族化关系 ●3、助于我们正确理解统一性与多样性关系 ●4、助于我们正确看待社会主义与资本主义的关系 ●5、帮助我们在世界视野下规划自己的人生 本章思考题

世界历史知识点(人教版)

世界古代史、近代史部分 (八年级下四、五单元及九年级上) 一、上古人类文明 【考试说明】 1.古代埃及的金字塔 北:八下P90 古代埃及文明最著名的历史遗产是金字塔,金字塔是埃及法老的陵墓。 2.古巴比伦的《汉谟拉比法典》 北:八下P91《汉谟拉比法典》是两河流域古巴比伦王国国王汉谟拉比制定的,是世界上第一部体系完备的法典。 3.古代印度的种姓制度 北:八下P92 婆罗门、刹帝利、吠舍和首陀罗构成了古代印度的种姓制度。种姓制度人为地制造了极不平等的社会等级。 4.人类早期文明产生的自然地理环境 北八下P90:第17课课题:大河流域的文明曙光。 5.雅典民主政治的基本状况 北:八下P95 伯里克利时代雅典民主政治达到极盛,在古代社会开创了民主政治的典范。 6.希腊是西方文明的发祥地。 八:下P94 古代希腊是西方文明发源地。 二、中古亚欧文明 1.大化改新的基本内容: 北:八下P101 公元646年,日本统治者进行一系列改革,史称“大化改新”,大化改新实行“班田收授法”,由国家将天下公田班给公民;实行租庸制度,统一租税;废除世袭贵族统治制度,建立中央集权体制,中央设二官八省,地方设国、郡、里,由中央派人管理。 2.穆罕默德的主要活动创立伊斯兰教,建立第一个阿拉伯国家 八:下P102 穆罕默德创立了伊斯兰教,伊斯兰教逐渐成为一面团结阿拉伯人的旗帜,穆罕默德率领信徒,打败了麦加贵族,建成历史上第一个阿拉伯国家。 三、文明的冲撞与融合 1.马可·波罗来华、阿拉伯数字的发明和传播等史实 北:八下P120 马可·波罗是意大利威尼斯的商人,随叔父来到中国元朝的上都,在中国当了17年的官,马可·波罗把他在中国的见闻口述成一本书,叫作《东方见闻录》(又译《马可·波罗行记》) 北:八下P120 阿拉伯数字原本是印度人发明的,经过阿拉伯人的传播,成为世界上人们共同使用的数字。 2.世界各民族各地区文明交往的方式。

基于NetFlow的网络流量采集技术和应用

第31卷 第23期 2009年12月武 汉 理 工 大 学 学 报JOURNA L OF WUHAN UNIVERSIT Y OF TECHN OLOG Y Vol.31 No.23 Dec.2009DOI :10.3963/j.issn.167124431.2009.23.037 基于N etFlow 的网络流量采集技术和应用 孟晓蓓 (武汉大学计算机中心,武汉430072) 摘 要: 针对计算机网络状况监控领域的实际需要,提出了基于Net Flow 的流量采集技术。相比其它的流量采集工具,Net Flow 的流量采集技术具有配置方便,费用低,占用资源小的优点。分析了Net Flow 交换技术采集网络流量信息的实现原理。并从计算机网络的网络层和传输层2个方面,讨论了Net Flow 网络流量采集技术在网络信息安全方面的相关应用。 关键词: 流量采集; Net Flow ; 网络攻击 中图分类号: TP 393.06文献标识码: A 文章编号:167124431(2009)2320155204 N et work Flux Collection T echnique B ase on N etFlow and Its Application M EN G Xiao 2bei (Computer Center ,Wuhan University ,Wuhan 430072,China ) Abstract : This paper proposes the network flux collection technique based on net flow according to practical requirements in the field of monitoring the status of computer https://www.360docs.net/doc/4d14827201.html,pared to other flux collection tools ,Net Flow has advantages of con 2venient configuration ,low cost and small occupied resources.This paper analyses the principle of realization of Net Flow ex 2change technique collecting network flux information.Then both from the network layer and transport layer ,the paper discuss 2es some relevant applications of Net Flow network flux collection technique using in network information security areas. K ey w ords : flux collection ; Net Flow ; network attack 收稿日期:2009207209. 作者简介:孟晓蓓(19572),女,高级实验师.E 2mail :meng1025@https://www.360docs.net/doc/4d14827201.html, 随着Internet 和Intranet 的发展,网络用户、接入设备日益增长,对计算机网络的安全运行产生了压力。因此,计算机网络状况的实时监控的工作,显得十分必要。计算机网络状况的实时监控的一个重要环节,就是网络上的数据流量进行统计和分析。由于各种各样的应用对网络带宽的需求越来越高,传统的网络流量统计和数据采集方式开销大、对数据传输延时的影响大,已经不能满足现在的需求,因此,需要一种新的流量统计技术来适应现在的网络环境。Net Flow 技术正是这样的能适应新环境的流量采集方法。 1 网络流量采集的特点和方法 理想的数据采集方式应该具备以下一些特点[1]: 1)不影响数据流转发的速度 在整个数据流的采集过程中,不能有明显影响数据流转发速度的状况发生。如果在数据采集的过程中,数据流转发的速度明显下降,不能真实地反映网络流量状况,这违背数据采集的根本目的。 2)占用资源小 对数据流进行采集的过程中,可能需要在路由器(交换机)中进行流量统计,并且储存所

论马克思世界历史理论的方法论意义

论马克思世界历史理论的方法论意义 本文从网络收集而来,上传到平台为了帮到更多的人,如果您需要使用本文档,请点击下载按钮下载本文档(有偿下载),另外祝您生活愉快,工作顺利,万事如意! 世界历史理论是马克思批判地继承了黑格尔关于世界历史思想的合理因素,运用其创造的唯物史观及剩余价值理论,深入研究近代以来经济与社会的运动及其发展趋势而创立的。马克思分析和讨论许多问题都是从世界历史的视野和高度进行的,不懂得或忽视这一点,在理解马克思的思想时势必会造成许多误解和曲解。在很长一个时期内,我们对于马克思世界历史理论及其重要意义认识不足,这是造成我们对于“什么是社会主义、如何建设社会主义”这个时代课题理论上“不太清楚”、实践上走了很多弯路的重要原因之一。面对经济全球化浪潮的巨大冲击,总结世界社会主义发展的历史经验、重新理解和谋划现代化方略以及建设中国特色社会主义的迫切需要,激活了世界历史理论这个重要思想资源,使之成为近年来我国马克思主义哲学研究的一个理论热点问题。显然,世界历史理论既是我们重新理解和解读马克思主义基本理论的重要切入点,也是显现马克思主义当代价值的重要方面。

一、马克思对黑格尔世界历史思想的创造性转换 第一,黑格尔认为世界历史是绝对精神在时间上的展开和在空间上的扩展,是精神不断获得解放和自由的过程,“世界历史……表示‘精神’的意识从它的‘自由’意识和从这种‘自由’意识产生出来的实现的发展”。①马克思则认为,“历史向世界历史的转变,不是‘自我意识’、世界精神或者某个形而上学幽灵的某种纯粹的抽象行为,而是完全物质的、可以通过经验证明的行动,每一个过着实际生活的、需要吃、喝、穿的个人都可以证明这种行动。”⑤因为它从根本上说是社会生产力和交往关系发展的结果,是现实生活的人们、人们的吃穿住行的现实生活超越了民族国家的界限而与整个世界联系在一起的结果。 第二,黑格尔“世界历史”概念的外延基本上可以等同于一般意义上的“人类历史”,是各个民族历史发展的总和。尽管黑格尔基于“巨大的历史感”力图将人类历史当作一个总体去探寻其内在联系,但他却不能“历史地”看待世界历史的形成问题。换句话说,基于“绝对精神”展现自身的唯心主义框架,他更多地关注了人类历史发展中的连续性、统一性,而没有注意到其中的间断性和“质变”。马克思的“世界历史”概念则不同,它以“历史转变为世界历史”为对象性根据,而

Openflow Switch 测试方法学

Contents 1. Test case 1:测试Openflow 交换机的流表容量 (1) 2. Test case 2:测试Openflow 交换机的流表学习速率 (5) 3. Test case 3:测试Openflow 交换机的吞吐量,时延,抖动和丢包率 (12) 4. Test case 4:测试Openflow 交换机的流表震荡 (14) 1.Test case 1:测试Openflow交换机的流表容量 ?测试目的:测试Openflow交换机最多能支持的流表数量 ?测试拓扑: ?预配置(请注意,预配置部分是写本文需要,在OpenvSwitch上所做的配置。读者在用OVS做实验时候可参考此配置,实际测试则不需要进行此部分) 设置br1 的flow table 0 表项容量为100 Step 1:在OVS 的ovsdb中,在Bridge 表中,把br1 条目的flow_tables列中关联br1 的 flow_table 0, 并且在Flow_Table表中创建一行。 ovs-vsctl set Bridge br1 flow_tables:0=@table0 -- --id=@table0 create Flow_Table name=table0 查看Bridge表和Flow_Table表: [root@localhostmrzhao]# ovs-vsctl list bridge _uuid : c5601237-6574-465b-843f-ac52c61d5bad

Controller : [bca3710d-1280-44eb-8436-20bbe5c8161c] datapath_id : "0000000c2992086a" datapath_type : "" external_ids : {} fail_mode : [] flood_vlans : [] flow_tables : {0=bebe5b02-6216-4a8a-af5d-27f1dde2bf48} ipfix : [] mirrors : [] name : "br1" netflow : [] other_config : {} ports : [358480c2-0709-476d-8446-3020584454d0, 4f1a7238-d611-4345-8b06-83a62d414952, 5dd30471-07c4-4eac-90a1-0cf7d96e7b07, a4c3be4c-bda5-4686-af08-4e59d51040bd, eaf6eb05-0d95-4775-9abb-1b139469a9b9] protocols : [] sflow : [] status : {} stp_enable : false [root@localhostmrzhao]# ovs-vsctl list Flow_table _uuid : bebe5b02-6216-4a8a-af5d-27f1dde2bf48 external_ids : {} flow_limit : [] groups : [] name : "table0" overflow_policy : [] prefixes : [] Step 2:设置br1 的table0 的流表大小是100条流表项 ovs-vsctl set Flow_Table table0 flow_limit=100 查看流表项设置:

相关文档
最新文档