当前位置: 首页 > news >正文

网站扫二维码怎么做小程序开发定制开发

网站扫二维码怎么做,小程序开发定制开发,公司三站合一的网站,我的世界做视频封面的网站保存日志到数据库 请求日志几乎是所有大型企业级项目的必要的模块#xff0c;请求日志对于我们来说后期在项目运行上线一段时间用于排除异常、请求分流处理、限制流量等。请求日志一般都会记录请求参数、请求地址、请求状态#xff08;Status Code#xff09;、SessionId、…保存日志到数据库 请求日志几乎是所有大型企业级项目的必要的模块请求日志对于我们来说后期在项目运行上线一段时间用于排除异常、请求分流处理、限制流量等。请求日志一般都会记录请求参数、请求地址、请求状态Status Code、SessionId、请求方法方式Method、请求时间、客户端IP地址、请求返回内容、耗时等等。如果你得系统还有其他个性化的配置也可以完成记录。 在实际的项目中特别是管理系统中对于那些重要的操作我们通常都会记录操作日志。比如对数据库的CRUD操作我们都会对每一次重要的操作进行记录通常的做法是向数据库指定的日志表中插入一条记录。这里就产生了一个问题难道要我们每次在 CRUD的时候都手动的插入日志记录吗这肯定是不合适的这样的操作无疑是加大了开发量而且不易维护所以实际项目中总是利用AOP(Aspect Oriented Programming)即面向切面编程这一技术来记录系统中的操作日志。Logback也提供了保存日志到数据库的功能。 1、添加依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--mysql数据源--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency!-- lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.34/versionscopeprovided/scope/dependency!--日志相关--dependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactIdversion1.4.5/version/dependency!-- 自动依赖 slf4j-api --dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.4.5/version/dependency!-- logback操作数据库的包 --dependencygroupIdch.qos.logback.db/groupIdartifactIdlogback-classic-db/artifactIdversion1.2.11.1/version/dependency!--这个依赖必须存在否则会报java.lang.ClassNotFoundException.org.apache.commons.dbcp.BasicDataSource--dependencygroupIdcommons-dbcp/groupIdartifactIdcommons-dbcp/artifactIdversion1.4/version/dependency/dependencies2、创建日志数据库 创建一个数据库logs_db该库中创建如下表 BEGIN; DROP TABLE IF EXISTS system_log; COMMIT;BEGIN; CREATE TABLE system_log (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键id,create_time datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT 创建时间,update_time datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT 更新时间,ip_addr varchar(154) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 客户端ip地址,message text NOT NULL COMMENT 详情,level_string varchar(254) NOT NULL COMMENT 等级,logger_name varchar(254) NOT NULL COMMENT 名称,caller_filename varchar(254) NOT NULL COMMENT 文件名,caller_class varchar(254) NOT NULL COMMENT 类,caller_method varchar(254) NOT NULL COMMENT 方法,caller_line char(4) NOT NULL COMMENT 行数,PRIMARY KEY (id) USING BTREE ) ENGINE InnoDB DEFAULT CHARSET utf8 COMMENT 系统日志; COMMIT;3、创建LogDBAppender类 该类是用来操作日志数据库的类 /*** 自定义日志保存类*/ Configuration Slf4j public class LogDBAppender extends DBAppenderBaseILoggingEvent {private static final int CREATE_TIME_INDEX 1;private static final int UPDATE_TIME_INDEX 2;private static final int IP_ADDR3;private static final int MESSAGE_INDEX 4;private static final int LEVEL_STRING_INDEX 5;private static final int LOGGER_NAME_INDEX 6;private static final int CALLER_FILENAME_INDEX 7;private static final int CALLER_CLASS_INDEX 8;private static final int CALLER_METHOD_INDEX 9;private static final int CALLER_LINE_INDEX 10;protected String insertSQL;protected static final Method GET_GENERATED_KEYS_METHOD;protected static final StackTraceElement EMPTY_CALLER_DATA CallerData.naInstance();private static String buildInsertSQL() {StringBuilder sqlBuilder new StringBuilder(INSERT INTO system_log );sqlBuilder.append((create_time, update_time,ip_addr, message, level_string, logger_name, caller_filename, caller_class, caller_method, caller_line) );sqlBuilder.append(VALUES (?, ?,?, ? ,?, ?, ?, ?, ?, ?));return sqlBuilder.toString();}Overridepublic void start() {this.insertSQL buildInsertSQL();super.start();}Overrideprotected Method getGeneratedKeysMethod() {return GET_GENERATED_KEYS_METHOD;}Overrideprotected String getInsertSQL() {return this.insertSQL;}Overrideprotected void subAppend(ILoggingEvent iLoggingEvent, Connection connection, PreparedStatement preparedStatement) throws Throwable {this.bindLoggingEventWithInsertStatement(preparedStatement, iLoggingEvent);this.bindCallerDataWithPreparedStatement(preparedStatement, iLoggingEvent.getCallerData());int updateCount preparedStatement.executeUpdate();if (updateCount ! 1) {this.addWarn(Failed to insert loggingEvent);}}Overrideprotected void secondarySubAppend(ILoggingEvent iLoggingEvent, Connection connection, long l) throws Throwable {}private void bindCallerDataWithPreparedStatement(PreparedStatement preparedStatement, StackTraceElement[] callerDataArray) throws SQLException {StackTraceElement caller this.extractFirstCaller(callerDataArray);preparedStatement.setString(CALLER_FILENAME_INDEX, caller.getFileName());preparedStatement.setString(CALLER_CLASS_INDEX, caller.getClassName());preparedStatement.setString(CALLER_METHOD_INDEX, caller.getMethodName());preparedStatement.setString(CALLER_LINE_INDEX, Integer.toString(caller.getLineNumber()));}private StackTraceElement extractFirstCaller(StackTraceElement[] callerDataArray) {StackTraceElement caller EMPTY_CALLER_DATA;if (this.hasAtLeastOneNonNullElement(callerDataArray)) {caller callerDataArray[0];}return caller;}private boolean hasAtLeastOneNonNullElement(StackTraceElement[] callerDataArray) {return callerDataArray ! null callerDataArray.length 0 callerDataArray[0] ! null;}private void bindLoggingEventWithInsertStatement(PreparedStatement preparedStatement, ILoggingEvent iLoggingEvent) throws SQLException {Date date new Date(iLoggingEvent.getTimeStamp());preparedStatement.setDate(CREATE_TIME_INDEX, date);preparedStatement.setDate(UPDATE_TIME_INDEX, date);preparedStatement.setString(IP_ADDR,getUserIP());preparedStatement.setString(MESSAGE_INDEX, iLoggingEvent.getFormattedMessage());preparedStatement.setString(LEVEL_STRING_INDEX, iLoggingEvent.getLevel().toString());preparedStatement.setString(LOGGER_NAME_INDEX, iLoggingEvent.getLoggerName());}public String getUserIP() {ServletRequestAttributes requestAttributes ServletRequestAttributes.class.cast(RequestContextHolder.getRequestAttributes());HttpServletRequest contextRequest requestAttributes.getRequest();String remoteAddr ;if (contextRequest ! null) {remoteAddr contextRequest.getHeader(X-FORWARDED-FOR);if (remoteAddr null || .equals(remoteAddr)) {remoteAddr contextRequest.getRemoteAddr();}}return remoteAddr;}static {Method getGeneratedKeysMethod;try {getGeneratedKeysMethod PreparedStatement.class.getMethod(getGeneratedKeys, (Class[])null);} catch (Exception var2) {getGeneratedKeysMethod null;}GET_GENERATED_KEYS_METHOD getGeneratedKeysMethod;} }4、创建配置文件logback-spring.xml 新版的logback中去除了DBAppender类如查要保存到数据库需要重写该类参考步骤6 ?xml version1.0 encodingUTF-8? configuration debugfalse!--控制台日志格式彩色日志--!-- magenta:洋红 --!-- boldMagenta:粗红--!-- green:绿色--!-- boldGreen:深绿色--!-- cyan:青色 --!-- white:白色 --conversionRule conversionWordclr converterClassorg.springframework.boot.logging.logback.ColorConverter /conversionRule conversionWordwex converterClassorg.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter /conversionRule conversionWordwEx converterClassorg.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter /!-- 彩色日志格式 --property nameCONSOLE_LOG_PATTERN value${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}/!--编码--property nameENCODING valueUTF-8/!--输出到控制台--appender nameCONSOLE classch.qos.logback.core.ConsoleAppenderfilter classch.qos.logback.classic.filter.ThresholdFilter!--日志级别--levelDEBUG/level/filterencoder!--日志格式--Pattern${CONSOLE_LOG_PATTERN}/Pattern!--日志字符集--charset${ENCODING}/charset/encoder/appender!--连接数据库配置--appender namedb_classic_mysql_pool classcom.woniu.logs.LogDBAppenderconnectionSource classch.qos.logback.core.db.DataSourceConnectionSourcedataSource classorg.apache.commons.dbcp.BasicDataSourcedriverClassNamecom.mysql.cj.jdbc.Driver/driverClassNameurljdbc:mysql://127.0.0.1:3306/logs_db?serverTimezoneAsia/Shanghai/urlusernameroot/usernamepassword123456/password/dataSource/connectionSource/appender!--myibatis log configure--logger namecom.apache.ibatis levelTRACE/logger namejava.sql.Connection levelDEBUG/logger namejava.sql.Statement levelDEBUG/logger namejava.sql.PreparedStatement levelDEBUG/!-- 日志输出级别 --root levelINFOappender-ref refCONSOLE/appender-ref refdb_classic_mysql_pool//root /configuration5、修改yml server:port: 8080 spring:application:name: log-demologging:level:com:woniu:dao: DEBUGroot: INFOconfig: classpath:logback-spring.xml6、测试 编写测试代码 RestController Slf4j public class UserController {GetMapping(login)public String getUser(String account,String password){if(account.equals(tom) password.equals(123)){log.info(用户account登录成功);}else{log.warn(用户名或密码错误);}return 测试lomback保存日志;} }
http://www.hkea.cn/news/14554557/

相关文章:

  • 城乡建设网站首页默认缩略图 wordpress
  • 公司网站建设论文网站建设包括哪些内容
  • 北京定制网站国外做伞的品牌网站
  • 建设网站招标centos7.2做网站
  • 网站开发的前台开发工具百度权重排名高的网站
  • 如何做网站推广的方案设计互联网站备案管理工作方案 工信部
  • 阿旗建设局举报网站长沙河东做网站
  • 巴南市政建设网站网站如何与域名绑定
  • 手机制作小程序软件的app天津企业seo
  • 专门做预言的网站win系统更新后 wordpress
  • 一级做a爱网站免费php网站开发都需要什么软件
  • 大连网络备案做网站有口碑的宁波网站建设
  • 做网站包括什么软件个人简历网页制作代码
  • 途途外贸企业网站管理系统上海有什么公司
  • 制作一个自适应网站培训教育机构
  • 网站建设主要业务流程设定怎么做像天猫类似的网站
  • 网站里的横幅怎么做汕头建站模板源码
  • 学做网站后台开发长春做网站建设的公司
  • 宁波外贸公司为什么这么多怎么优化网站关键词的方法
  • 怎么用we做网站礼品公司网站制作
  • 网站和网页微网站如何做微信支付宝支付
  • 免费网站推广工具青岛团购网站建设
  • 网站建设合同 含维护费申请域名要钱吗
  • p2p网站开发公司西宁网站设计高端
  • 网站后台管理系统数据库织梦cms仿网站教程
  • 福州网站设计网站系统制作会议管理系统
  • 绚丽的网站欣赏手机购物app排行榜前十名
  • 八里河风景区网站建设内容摘要北京移动端网站开发
  • 无锡网站seo动画制作软件排行榜
  • 顺义区专业网站制作网站建设免费ppt下载网站有哪些