Log4j三大组件运行机制

深入掌握Java日志管理:Log4j详解与实战 Log4j 是 Java 生态中最早、最成熟、也是最广泛使用的日志记录框架之一。其设计思想和模块化架构对后来的日志框架(如 Logback)产生了深远影响。本章将系统性地介绍 Log4j 的发展背景、核心架构特点及其五大核心组件的运作机制,帮助开发者从架构层面理解其工作原理与使用方式。PatternLayout通过参数定义输出格式,常用占位符如下:占位符含义%d日期%t线程名%p日志级别%c类名%M方法名%L行号%m消息内容%n换行符@Override。 阅读详情


Log4j主要有三个组件:
    Logger:负责供客户端代码调用,执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
    Appender:负责日志的输出,Log4j已经实现了多种不同目标的输出方式,可以向文件输出日志、向控制台输出日志、向Socket输出日志等。
    Layout:负责日志信息的格式化。
   

执行顺序及关系
      调用Log4j输出日志时,调用各个组件的顺序:
    1、日志信息传入 Logger。
    2、将日志信息封装成 LoggingEvent 对象并传入 Appender。
    3、在 Appender 中调用 Filter 对日志信息进行过滤,调用 Layout 对日志信息进行格式化,然后输出。

Log4j 中三种设置配置信息的方式:
   1、利用系统提供的 BasicConfigurator
   2、利用 properties 格式的配置文件,通过 PropertyConfigurator 类来从一个 perproties 文件中加载配置信息。
   3、利用 XML 文件来配置信息,通过 DOMConfigurator 类来从一个 XML 文件中加载配置信息。

下面的图片来自于网络:



源码分析Log4j工作原理: (源自:http://flym.iteye.com/blog/417434)

Log4j如何加载配置文件,并进行日志记录?

    将Log4j从网上down下来,并建立工程,将源代码导进去。从Logger入手,一般来说,取得一个Log都是通过

Java代码  收藏代码
  1. Logger getLogger(Class clazz) {  
  2.     return LogManager.getLogger(clazz.getName());  
  3.  }  

 

转入LogManager,首先应该注意的是这个类的static块, 这个块其实就是一个加载log4j配置文件的过程。即在程序启动之初,在JVM需要加载这个类时,这个初始化块会自动运行,并且加载整个配置,以完成log4j的启动。

Java代码  收藏代码
  1. Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));  
  2. ......  
  3. OptionConverter.selectAndConfigure(url, configuratorClassName,  
  4.                        LogManager.getLoggerRepository());  

 

上面的所有代码均完成两件事,第一件事就是构造一个ROOT的Logger对象,此对象作为所有logger对象的最上层,其它logger的相应属性均从这个对象进行继承或改写,就好像java里的继承一样,这个类是内定的,不能由配置文件直接指定,且root都是在最顶层的,其他logger均在此下,这样形成一个完整的logger树。下层可以引用上层,上层管理下层。    第二件事则是去寻找配置文件的地址信息,通过各种方法都寻找log4j.xml或log4j.properties文件,然后对文件进行解析。(在此处,通过properties文件进行解析)

Java代码  收藏代码
  1. OptionConverter.void selectAndConfigure(URL url, String clazz, LoggerRepository hierarchy)  

 这个方法会最终通过指定的文件解析类(此处是PropertyConfigurator)进行解析,转入

Java代码  收藏代码
  1. configurator.doConfigure(url, hierarchy)  

 这个方法将,url转化成一个properties对象,进行解析。

Java代码  收藏代码
  1. doConfigure(props, hierarchy);  

 进入这个方法

Java代码  收藏代码
  1. String value = properties.getProperty(LogLog.DEBUG_KEY);//即log4j.debug  
  2.     if(value == null) {  
  3.       value = properties.getProperty("log4j.configDebug");  
  4.       if(value != null) {  
  5.       LogLog.setInternalDebugging(OptionConverter.toBoolean(value, true));  
  6.     }  

  上面方法读取一个关于log4j自身的debug Level信息,主要用于log4j内部在解析时调用(因为log4j还不能使用logger对象进行写信息,它用到一个LogLog的类,来模拟logger记录,用于在自身解析的过程中输出一些信息),一般来说,这个都用不到。

    主要的信息集中在以下三句话:

Java代码  收藏代码
  1. configureRootCategory(properties, hierarchy);  
  2. configureLoggerFactory(properties);  
  3. parseCatsAndRenderers(properties, hierarchy);  

 

第一句话用于解析root根对象上的相关配置。

第二句话用于解析loggerFactory(factory用于创建logger对象)

第三句话用于解析除rootLogger之外的其他logger以及render信息。

 

第一句:

Java代码  收藏代码
  1.  void configureRootCategory(Properties props, LoggerRepository hierarchy) {  
  2.    String effectiveFrefix = ROOT_LOGGER_PREFIX;  
  3.    String value = OptionConverter.findAndSubst(ROOT_LOGGER_PREFIX, props);  
  4.    if(value == null) {  
  5.      value = OptionConverter.findAndSubst(ROOT_CATEGORY_PREFIX, props);  
  6.      effectiveFrefix = ROOT_CATEGORY_PREFIX;  
  7.    }  
  8. .....  
  9.      Logger root = hierarchy.getRootLogger();  
  10.      synchronized(root) {  
  11. parseCategory(props, root, effectiveFrefix, INTERNAL_ROOT_NAME, value);  
  12.      }  
  13.  }  

 

上面语句用于从属性文件中寻找logger.rootLogger或logger.rootCategory属性的值然后,再进行配置rootLogger对象信息(如Level,appender等)

Java代码  收藏代码
  1.   void parseCategory(Properties props, Logger logger, String optionKey,  
  2.              String loggerName, String value) {  
  3.   
  4.   StringTokenizer st = new StringTokenizer(value, ",");  
  5.     if(!(value.startsWith(",") || value.equals(""))) {  
  6.       if(!st.hasMoreTokens())  
  7.     return;  
  8.   
  9.       String levelStr = st.nextToken();  
  10.       if(INHERITED.equalsIgnoreCase(levelStr) ||   
  11.                                       NULL.equalsIgnoreCase(levelStr)) {  
  12.     if(loggerName.equals(INTERNAL_ROOT_NAME)) {  
  13.       LogLog.warn("The root logger cannot be set to null.");  
  14.     } else {  
  15.       logger.setLevel(null);  
  16.     }  
  17.       } else {  
  18.     logger.setLevel(OptionConverter.toLevel(levelStr, (Level) Level.DEBUG));  
  19.       }  
  20.   
  21.     logger.removeAllAppenders();  
  22.   
  23.     Appender appender;  
  24.     String appenderName;  
  25.     while(st.hasMoreTokens()) {  
  26.       appenderName = st.nextToken().trim();  
  27. ......  
  28.       appender = parseAppender(props, appenderName);  
  29.       if(appender != null) {  
  30.     logger.addAppender(appender);  
  31.       }  
  32.     }  
  33.   }  

 

上面这些内容,即是通过logger属性的值(形如debug,A,R)等,然后将值以,分隔进行解析,将第一个字符串定义为logger的Level信息,后面的值则定义为此logger的appender名称。

    当然上面这个方法,即不是尽为rootLogger服务,对于其他logger也调用这个方法,故上面在解析Level时,对root作了单独判断(因为rootLogger的Level不能为空,至少均需要一个值)。处理Level,即将level值简单设置在logger上即可以了。

   接下来即解析appender信息,通过紧接着level后面的字符串,按列表方式进行解析,然后将appender加入logger的appenderList(即要进行信息处理的监听器表)中。进入parseAddpender(解析appender)

Java代码  收藏代码
  1.  String prefix = APPENDER_PREFIX + appenderName;  
  2.  String layoutPrefix = prefix + ".layout";  
  3.   
  4.  appender = (Appender) OptionConverter.instantiateByKey(props, prefix,  
  5.               org.apache.log4j.Appender.class,  
  6.               null);  
  7. ...  
  8.  appender.setName(appenderName);  
  9.   
  10.  if(appender instanceof OptionHandler) {  
  11.    if(appender.requiresLayout()) {  
  12. yout layout = (Layout) OptionConverter.instantiateByKey(props,  
  13.                       layoutPrefix,  
  14.                       Layout.class,  
  15.                       null);  
  16. ...  
  17. appender.setLayout(layout);  
  18.        PropertySetter.setProperties(layout, props, layoutPrefix + ".");  
  19. LogLog.debug("End of parsing for \"" + appenderName +"\".");  
  20.   
  21.    }  
  22.    PropertySetter.setProperties(appender, props, prefix + ".");  
  23.  }  
  24.  registryPut(appender);  

 上面这个方法,即是解析appender对象,通过log4j.appender.X的前缀(X表示在rootLogger后的appender名称)来取得appender类名,并尝试实例化,然后根据appender来判断是否需要再解析appender的layout(即log4j.appender.X.layout这个键),解析并设置相应属性,最后分别解析appender本身的属性信息和layout的属性信息。(通过ProperSetter这个类,根据javaBean属性映射,将指定后缀后的信息当作一个键,后缀在属性文件中的值作为指定键的值,并将这个键值映射,通过javaBean设置到相应的对象上)

 

    至此,rootLogger即解析完毕。

 

   第二句:解析loggerFactory,略。

   第三句:解析其他logger信息。

Java代码  收藏代码
  1.   void parseCatsAndRenderers(Properties props, LoggerRepository hierarchy) {  
  2.     Enumeration enumeration = props.propertyNames();  
  3.     while(enumeration.hasMoreElements()) {  
  4.       String key = (String) enumeration.nextElement();  
  5.       if(key.startsWith(CATEGORY_PREFIX) || key.startsWith(LOGGER_PREFIX)) {  
  6.     String loggerName = null;  
  7.     if(key.startsWith(CATEGORY_PREFIX)) {  
  8.       loggerName = key.substring(CATEGORY_PREFIX.length());  
  9.     } else if(key.startsWith(LOGGER_PREFIX)) {  
  10.       loggerName = key.substring(LOGGER_PREFIX.length());  
  11.     }  
  12.     String value =  OptionConverter.findAndSubst(key, props);  
  13.     Logger logger = hierarchy.getLogger(loggerName, loggerFactory);  
  14.     synchronized(logger) {  
  15.       parseCategory(props, logger, key, loggerName, value);  
  16.       parseAdditivityForLogger(props, logger, loggerName);  
  17.     }  
  18.       } else if(key.startsWith(RENDERER_PREFIX)) {  
  19. ......  
  20.       }  
  21.     }  
  22.   }  

 

这个方法,则主要根据logger.logger为前缀的属性信息进行解析,并根据这个属性信息生成logger,并放在继承树中,设置相应树信息,最后设置其他信息(如appender,level)等,与rootLogger解析基本一致。

 

至此,整个log4j的配置信息已经完成,而这个配置是由JVM保证线程化的(即只能被加载一次),在使用时整个配置已经加载成功,得到的已经是从配置信息中得到的logger对象了。



Apache Log4j 1.2.15:企业级日志记录框架入门与进阶 在Log4j中,日志级别用于表示日志事件的严重性或紧急性。从最不严重到最严重,Log4j定义了以下日志级别:DEBUG, INFO, WARN, ERROR, 和 FATAL。日志级别越高,表示问题的严重程度越大。DEBUG: 此级别通常用于开发和调试阶段。它记录了程序运行的详细信息,有助于识别和解决问题。INFO: 此级别用于记录系统的常规运行信息,如服务启动、接收请求等。WARN: 此级别用于记录可能不是错误情况,但需要引起注意的事件。 阅读详情

相关推荐

MyBatis+MySQL+Log4j Java开发常用Jar包整合实战

为了提升用户体验和系统健壮性,应在全局层面捕获MyBatis相关异常并转换为统一响应格式。可通过实现:"数据库操作失败,请稍后重试",其中ApiError为标准化错误响应体:"message": "数据库操作失败,请稍后重试",该机制实现了异常隔离,避免底层细节暴露给前端,符合微服务设计规范。Log4j采用命名层级继承机制,如会继承以及更上层的Logger配置。除非显式指定了additivity为false,否则日志事件将沿层级向上传播。

weixin_35871529的博客 958

Log4j启动过程

    用了好久的log4j,但还是不知道Log4j究竟是基于怎样的原理来进行工作,以及为何在项目中除了Log4j之外,还需要一个common-logging来协同进行日志记录。在网上看了下相应介绍,都说common-logging是一个日志的管理框架,具体的事情还是交由log4j来进行记录。决定从源码出发,看看Log4j如何加载配置文件,并进行日志记录。     将Log4j从网上down下来...

Fly_m的专栏 352

QT编程系列1--QT学习前需知

本周学习了一些QT编程方面的知识,学写了几个程序,这里把记录下来。一方面对前面学习的知识做一个总结,便于以后复习、再学习和应用;另一方面也和大家做个交流,有不足的地方请各位看官多指点。   首先是做一些学习之前的交代:一,学习QT需要哪些基础;二,学习QT有哪些用途,QT较其他的开发工具有哪些特点;三,学习QT的思路。

霜月孤鸟&RTEMS&TinyOS 1115

Log4j输出方式和输出格式的配置

Log4j输出方式和输出格式的配置

Leon_Jinhai_Sun的博客 525

SAP开发顾问简历模板范文(精选篇)

SAP开发顾问简历该怎么写呢?

Huanzhucv的博客 1568

Claude AI实战指南:从注册到精通,突破手机验证的终极解决方案

本文提供了一份详尽的Claude AI实战指南,重点解决了国内用户注册过程中的手机号验证难题,并分享了使用技巧。文章详细介绍了如何通过虚拟手机号服务等方案完成注册,并深入解析了Opus、Sonnet、Haiku三大模型的特点与选择策略,帮助用户从注册到精通,高效利用这一安全、健谈的AI助手进行内容创作、编程开发与学习研究。

weixin_29092031的博客 1229

Log4j学习笔记

Log4j学习笔记1 入门实例2 Log4j基本使用方法2.1 定义配置文件 1 入门实例 我这里在我的Maven项目中先引入log4j的包 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12<...

Snail_565的博客 1364

【汽车主动降噪】【ANC算法优化】基于深度学习的汽车主动噪声控制技术研究及Matlab实现

本文探讨了基于深度学习的汽车主动降噪(ANC)算法优化方案。针对传统FXLMS算法在应对复杂、非线性车内噪声时的局限性,文章详细解析了如何利用神经网络作为非线性建模器、深度滤波器或智能步长调节器来增强ANC系统性能,并提供了完整的Matlab仿真实战流程,展示了深度学习在提升降噪效果和收敛速度方面的潜力。

seed的博客 540

Log4J学习【十六】Log4j的默认启动流程一

之前已经看到了使用properties文件或者xml文件配置Log4J的方式。但是,在这两种配置方式中,我们看到,都必须要使用者在整个应用启动之前,使用代码的方式完成Log4J相应配置的读取和加载。我们已经学习了Log4j这么久了,一直会有一个疑问,为什么Log4J就必须让我们自己来配置Log4J?为什么必须让我们自己去写那一段初始化代码?原因其实很简单,在Log4J中,所有的日志总的有一个输出的

HelloWorld的专栏 4204

cesium 淹没分析

cesium淹没分析

God's asylum的博客 480

【华为OD机试真题】65、高矮个子排队 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

题目描述 >现在有一队小朋友,他们高矮不同,我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。 >  我们现在希望小朋友排队,以"高" "矮" "高" "矮" 顺序排列,每一个高位置的小朋友要比相邻的位置高或者相等;每个 "矮" 位置的小朋友要比相邻的位置矮或者相等; >  要求小朋友们移动的距离和最小,第一个从“高"位开始排,输出最小移动距离即可。 >  例如,在示范小队{5,3,1,2,3}中, {5, 1, 3, 2, 3}是排序结果。 > 

KJ.JK 2097

开始使用Log4j

1、分别在src文件夹下面生成一个log4j.properties文件,在工程根目录下,新建一个log文件夹,再在该文件夹下面新建log.log文件和errorlog.log文件。 2、打开log4j.properties文件     log4j.rootLogger=debug, stdout, log log4j.Logger=search,Test   ###Con...

360

基于STM32+华为云设计的智能鱼缸

本项目基于STM32单片机设计一款基于物联网的智能鱼缸系统,并通过应用侧接口开发上位机APP实现远程对鱼缸参数的检测和控制。该系统包括水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能,可以帮助用户更好地管理鱼缸,提高鱼儿的生存率,同时增强用户对家庭装饰品的掌控感和科技感。

1万+

Java组件安全攻防实战:Solr、Shiro、Log4j漏洞组合利用与纵深防御

在Java Web应用开发中,组件安全是构建健壮系统的基石。其核心原理在于理解各组件(如日志框架、鉴权模块、搜索引擎)的内部工作机制与交互方式,攻击者往往利用组件间的信任边界和配置缺陷,构造复杂的攻击链。从技术价值看,深入掌握组件安全机制不仅能有效防御远程代码执行(RCE)、反序列化等高风险漏洞,更是实现应用安全左移、提升整体安全水位的关键。在实际应用场景中,无论是电商、金融还是企业级后台系统,Apache Solr的未授权访问、Apache Shiro的硬编码密钥、Log4j2的JNDI注入等典型漏洞,常

cuanjingyue4687的博客 475

python ERA-5气象数据NetCDF格式解析(一)

python ERA-5气象数据NetCDF格式解析

weixin_43896283的博客 2637

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

flume+java应用_基于Flume+Log4j+Kafka的日志采集架构方案

本文将会介绍如何使用 Flume、log4j、Kafka进行规范的日志采集。Flume 基本概念Flume是一个完善、强大的日志采集工具,关于它的配置,在网上有很多现成的例子和资料,这里仅做简单说明不再详细赘述。Flume包含Source、Channel、Sink三个最基本的概念:Source——日志来源,其中包括:Avro Source、Thrift Source、Exec Source、JMS...

weixin_29466045的博客 383

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

基于Flume+Log4j+Kafka的日志采集架构方案

http://www.linuxidc.com/Linux/2016-05/131402.htm 本文将会介绍如何使用 Flume、log4j、Kafka进行规范的日志采集。 Flume 基本概念 Flume是一个完善、强大的日志采集工具,关于它的配置,在网上有很多现成的例子和资料,这里仅做简单说明不再详细赘述。 Flume包含Source、Channel、

冷月宫主的专栏 747

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

基于Flume+LOG4J+Kafka的日志采集架构方案

本文将会介绍如何使用 Flume、log4j、Kafka进行规范的日志采集。 Flume 基本概念 Flume是一个完善、强大的日志采集工具,关于它的配置,在网上有很多现成的例子和资料,这里仅做简单说明不再详细赘述。Flume包含Source、Channel、Sink三个最基本的概念: Source——日志来源,其中包括:Avro Source、Thrift Source、...

weixin_30537451的博客 419

[INFRA] EMR集群AppPusher组件功能和运行原理分析

本文分析了EMR集群中的AppPusher组件功能及运行机制。AppPusher负责从HDFS收集Spark事件日志和YARN日志并上传到S3,支持EMR控制台的Persistent App UI功能。测试环境为EMR7.12版本,AppPusher运行在所有节点但仅在Master节点实际工作,Core节点因缺少凭证而空转。关键特性包括120秒定时调度、多线程并发、差量上传和STS凭证管理。与LogPusher相比,AppPusher专注于应用级日志收集,数据源为HDFS而非本地文件系统。Master节点和

zhaojiew的学习笔记 434

log4j+flume+HDFS实现日志存储

参考:http://blog.youkuaiyun.com/sum__mer/article/details/52474443 376 hadoop dfs -chown -R hadoop:hadoop /flume 377 hdfs dfs -chown -R hadoop:hadoop /flume 378 hdfs dfs -chown -R 777 /flume 37

u014033218的专栏 1724

linux下flume安装

1.1 运行机制1、 Flume分布式系统中最核心的角色是agent,flume采集系统就是由一个个agent所连接起来形成2、每一个agent相当于一个数据传递员,内部有三个组件:    a) Source:采集源,用于跟数据源对接,以获取数据    b) Sink:下沉地,采集数据的传送目的,用于往下一级agent传递数据或者往最终存储系统传递数据    c) Channel:angent内部...

xl.zhang的博客 9321

大数据----【Flume、常用组件、load-balance、failover、日志采集汇总、Flume中小文件频繁滚动注意事项】

Flume 1 概述 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的软件。 Flume核心 : 数据源(source) 目的地(sink) 数据传输通道(channel) Flume版本 : FlumeOG(0.9X版本的统称) , 老版本 FlumeNG(1.X版本的统称) , 该版本常用 2 . 运行机制 Flume 系统中核心的角色...

CoderBoom的博客 1159

【Spring Boot的运行原理】

Spring Boot 支持嵌入式 Servlet 容器,这意味着你的应用可以作为一个独立的可执行 JAR 文件运行,而无需传统的服务器部署。它以其简洁的配置和开箱即用的特性,极大地简化了 Spring 应用的构建过程。Spring Boot 是一个基于 Spring 框架的项目,旨在简化 Spring 应用的配置和部署。通过这个详细的探索,我们了解了 Spring Boot 通过其自动配置、嵌入式服务器和简化的构建过程如何简化 Spring 应用的开发。例如,要启用 actuator 的端点,你可以在。

qq_33545255的博客 836

基于Flume+Log4j+Kafka的日志采集架构方案(上)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34221112的博客 171

mysql最新两种java连接池技术-c3p0和Druid(德鲁伊连接池)实现 - 及几种的连接关闭方式实现

一、什么是数据库连接池? 官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。 个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。 二、数据库连接池的运行机制 (1) 程序初始化时创建连接池 (2) 使用时向连接池申请可用连接 (3) 使用完毕,将连

DrMaker的博客 921
上一篇: commons-logging和log4j
下一篇: linux打包压缩命令汇总
架构师的清醒
博客等级 码龄14年 291粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值