SpringBoot整合log4j日志与HashMap的底层原理解析

网友投稿 449 2022-11-06


SpringBoot整合log4j日志与HashMap的底层原理解析

一,SpringBoot与日志

1.springboot整合log4j日志记录

1.在resources目录下面创建日志文件,并引入:

代码如下(示例):

#log4j.rootLogger=CONSOLE,info,error,DEBUG

log4j.rootLogger=info,error,CONSOLE,DEBUG

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n

log4j.logger.info=info

log4j.appender.info=org.apache.log4j.DailyRollingFileAppender

log4j.appender.info.layout=org.apache.log4j.PatternLayout

log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n

log4j.appender.info.datePattern='.'yyyy-MM-dd

log4j.appender.info.Threshold = info

log4j.appender.info.append=true

#log4j.appender.info.File=/home/admin/pms-api-services/logs/info/api_servhttp://ices_info

log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info

log4j.logger.error=error

log4j.appender.error=org.apache.log4j.DailyRollingFileAppender

log4j.appender.error.layout=org.apache.log4j.PatternLayout

log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n

log4j.appender.error.datePattern='.'yyyy-MM-dd

log4j.appender.error.Threshold = error

log4j.appender.error.append=true

#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error

log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error

log4j.logger.DEBUG=DEBUG

log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender

log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout

log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n

log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd

log4j.appender.DEBUG.Threshold = DEBUG

log4j.appender.DEBUG.append=true

#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug

log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug

log4j\u4EE3\u7801

private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

2.引入log4j依赖

代码如下(示例):

org.springframework.boot

spring-boot-starter-log4j

1.3.8.RELEASE

3.Controller层测试

代码如下(示例):

@RestController

public class LoggController {

private static final Logger logger = LoggerFactory.getLogger(LoggController.class);

@RequestMapping("/printLog")

public String printLog(){

logger.info("日志打印输出了......");

return "Hello World.....";

}

}

2.使用Aop统一处理Web请求日志

1.导入依赖

代码如下(示例):

org.springframework.boot

spring-boot-starter-aop

2.Aop处理日志的类

@Aspect

@Component

public class WebLogAspect {

private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

@Pointcut("execution(public * com.oracle.order.controller.*.*(..))")

public void webLog() {

}

@Before("webLog()")

public void doBefore(JoinPoint joinPoint) throws Throwable {

// 接收到请求,记录请求内容

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

HttpServletRequest request = attributes.getRequest();

// 记录下请求内容

logger.info("URL : " + request.getRequestURL().toString());

logger.info("HTTP_METHOD : " + request.getMethod());

logger.info("IP : " + request.getRemoteAddr());

Enumeration enu = request.getParameterNames();

while (enu.hasMoreElements()) {

String name = (String) enu.nextElement();

logger.info("name:{},value:{}", name, request.getParameter(name));

}

}

@AfterReturning(returning = "ret", pointcut = "webLog()")

public void doAfterReturning(Object ret) throws Throwable {

// 处理完请求,返回内容

logger.info("RESPONSE : " + ret);

}

}

3.控制类

@RequestMapping("/getMember")

public String getMember(String name,Integer age){

return "success";

}

请求路径: http://localhost:8080/getMember?name=sunny&age=12

3.lombok插件的使用

1.导入依赖

代码如下(示例):

org.projectlombok

lombok

2.下载lombok插件

下载操作如下(示例):

1.进入idea主页面

2.打开idea左上角的file

3.找到settings,点开后找plugins

4.搜索lombox,点install进行安装

3.使用lombok插件的注解

下载操作如下(示例):

@Slf4j // 可以直接使用log打印输出 不需要创建对象

@Data //集成了Get Set toString的功能

public class Emp {

String username;

String password;

public static void main(String[] args) {

Emp emp = new Emp();

emp.setUsername("sunny");

emp.setPassword("123");

log.info(emp.toString());

}

}

4.Springboot对静态资源的映射规则

1."/**" 访问当前项目的任何资源,都去(静态资源的文件夹)找映射

"classpath:/META-INF/resources/",

"classpath:/resources/",

"classpath:/static/",

"classpath:/public/"

"/":当前项目的根路径直接访问html页面

例如:http://localhost:8080/test04.html

2.测试效果:

如果要实现带路径访问例如:

http://localhost:8081/springboot/static/test04.html

在该目录下再加一层同名文件

二,HashMap底层原理总结

1.hashmap的底层数据结构 1.8之前和1.8的区别?

数据结构:1.8前(数组+链表),1.8之后(数组+链表+红黑树)

table类型:一个是entry,一个是load

创建table时机,1.8之前是创建map时创建,1.8之后添加数据时创建

2.hashmap存储元素的过程

先判断hash值,看桶中是否有元素,没有则添加,有判断hash值是否一样,不一样的话直接在桶节点上划分一个链表,

 判断链表长度是否大于8,大于8转化为红黑树。如果hash一样的话,判断key内容是否一样,一样的话覆盖,链表后面追加,

 追加时判断是否大于红黑树节点,不大于直接添加,大于直接转换

3.hashMap 加载因子为什么0.75

因为加载因子过小,造成元素分散,空间浪费,加载因子过大,造成分布拥挤,链表长度加长,遍历麻烦。

4.hashmap 为什么长度是2的n次方

如果不是2的n次方,计算出索引容易相同,容易发生hash碰撞,导致其余数组空间很大程度上并没有存储数据

  链表和红黑树过长,效率降低

5.为什么转换成红黑树的节点是8

1.泊松分布,到8概率过小。慎用红黑树

 2.内存普通节点的两倍,节点足够多时,使用红黑树比较划算

6.hashmap的构造函数哪些?

HashMap提供了4个构造函数:

  1.HashMap():构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。

  2.HashMap(int initialCapacity):构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。

  3.HashMap(int initialCapacity, float loadFactor):构造一个带指定初始容量和加载因子的空 HashMap。

  4.HashMap(Map extends K, ? extends V> m):传入一个map以构造一个新的map,使用默认加载因子(0.75)


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:需求文档工具(需求文档工具有哪些)
下一篇:测试用例类型(测试用例设计分哪几种类型)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~