活动介绍
file-type

简化JavaScript日志:filter-console工具的使用方法

下载需积分: 41 | 6KB | 更新于2025-02-12 | 173 浏览量 | 3 下载量 举报 收藏
download 立即下载
在Web开发中,JavaScript是构建动态网页和前端应用不可或缺的技术。它允许开发者通过编写脚本实现与用户的交云、数据处理以及网络请求等功能。然而,在开发过程中,为了调试方便,开发者经常在代码中使用console.log()语句输出调试信息。这些调试信息在开发完成后,通常需要从生产环境中移除,以防止影响性能或暴露敏感信息。 在这一背景下,“filter-console”这个概念或工具显得十分重要。它专门用于过滤掉那些不需要的console.log()输出,使得在开发环境和生产环境之间能够更平滑地切换。使用filter-console,开发者可以减少发布产品时的调试信息,提高应用的性能,同时保护敏感信息不被意外输出。 ### JavaScript开发中的日志处理 日志处理是软件开发和运维中的一个常见需求。它帮助开发者跟踪程序的运行状态,定位错误,以及收集性能数据。在JavaScript中,控制台日志是最简单直接的日志记录方式。console对象提供了一系列方法用于输出信息,其中console.log()是最基本的方法。 尽管console.log()对于调试非常有用,但是过多的控制台输出信息会降低页面的加载和运行速度,增加性能负担,甚至可能导致信息泄露。在生产环境中,通常需要过滤掉这些调试信息,以优化性能和安全性。过滤控制台输出的常见方法包括: 1. 手动删除:在代码部署到生产环境之前,手动删除或注释掉console.log()语句。 2. 使用构建工具:借助构建工具(如Webpack或Rollup)在编译过程中自动移除这些语句。 3. 使用环境变量:设置环境变量来控制是否显示console.log()信息。 ### filter-console的实现原理 filter-console可能是一个库、插件或构建工具的钩子(hook),它根据特定的规则来过滤掉不需要的console.log()输出。这通常通过以下几个步骤实现: 1. **规则配置**:开发人员可以定义一系列规则来指定哪些console.log()需要被过滤掉。这些规则可能基于日志的来源文件、输出内容或者日志级别等。 2. **重写console.log()**:filter-console会重写全局的console.log()方法,在运行时替换为自定义的方法,这个自定义方法会根据之前定义的规则来决定是否输出日志。 3. **条件判断**:在自定义的console.log()方法内部,会添加条件判断逻辑。只有当条件满足时(比如处于开发环境、日志级别符合要求等),输出语句才会被执行。 4. **性能优化**:为了避免重写console.log()带来的性能开销,filter-console可能会在生产环境中完全移除console.log()调用,或者将其替换为一个空函数。 5. **提供接口**:filter-console可能会提供一些接口供开发者在不同的环境(如开发环境、测试环境和生产环境)之间切换配置。 ### 项目中的应用实例 假设有一个名为`sindresorhus-filter-console-ccfa864`的压缩包,它包含了filter-console工具的代码。使用这个工具,开发者可以在一个JavaScript项目中实施上述的过滤逻辑: - 在项目的构建或打包配置中引入`sindresorhus-filter-console-ccfa864`。 - 配置环境变量或构建脚本,指定filter-console的过滤规则。 - 在开发过程中,通过环境变量切换到开发模式,允许输出调试信息。 - 在代码部署前,切换到生产模式,filter-console自动过滤掉console.log()的输出。 - 如果开发环境中需要查看console.log()输出,可以快速地切换回开发模式,无需手动修改代码。 ### 结语 综上所述,filter-console工具或技术在JavaScript开发中扮演着重要的角色。通过合理地管理console.log()输出,开发者不仅能够优化应用性能,还能增强产品的安全性。此外,它也提高了开发效率,让开发者可以更专注于编写高质量的代码,而无需担忧日志的管理问题。对于每一个前端开发者来说,理解和掌握这样的技术都是十分必要的。

相关推荐

filetype

import fs from 'fs' import path from 'path' import { fileURLToPath } from 'url' import process from 'process' import child_process from 'child_process' const exec = child_process.execSync const __filename = fileURLToPath(import.meta.url) const rootPath = path.dirname(__filename) const consoleLogPath = path.join(rootPath, `publishLog_${format(getNowTime())}`) const modulePath = path.join(rootPath, 'npmjs/node_modules') //要发布的包目录 const res = fs.readdirSync(modulePath) let total = 0, packtotal = 0, successCount = 0, failedCount = 0, failedList = [], beginTime = getNowTime() function getNowTime() { const d = new Date() return `${d.getFullYear()}-${ d.getMonth() + 1 }-${d.getDate()}:${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}.${d.getMilliseconds()}` } function format(timeStr) { return timeStr.replace(/[\-\.\:]/g, '_') } batchPublish(res, consoleLogPath, modulePath) function batchPublish(res, consoleLogPath, modulePath, isSubDir) { let subPacktotal = 0, subSuccessCount = 0, subFailCount = 0 const subBeginTime = getNowTime() const isPublish = true console.log( `\n\n 【-- ${isSubDir ? getNowTime() : beginTime} --${isSubDir ? '子' : '总'}任务开始...】` ) res.forEach((item, index) => { const dPath = path.join(modulePath, item) const stat = fs.statSync(dPath) total++ if (stat.isDirectory()) { process.chdir(dPath) console.log(`-->进入目录:${dPath}`) const packageJsonPath = path.join(dPath, 'package.json') if (fs.existsSync(packageJsonPath)) { console.log(`\n已找到package.json文件,启动发布程序...\n`) subPacktotal++ packtotal++ const packageJsonContentString = fs.readFileSync(packageJsonPath, 'utf-8') const parsePackageJson = JSON.parse(packageJsonContentString) if ( parsePackageJson.scripts && Object.keys(parsePackageJson.scripts).length !== 0 ) { parsePackageJson.scripts = {} fs.writeFileSync(packageJsonPath, JSON.stringify(parsePackageJson)) } try { console.log(`包 名 称:${parsePackageJson.name}`) console.log(`文件位置:${dPath}`) console.log(`开始时间:${getNowTime()}\n`) if (isPublish) { console.log(`正在发布中...\n`) exec('npm version patch && npm publish --registry http://localhost:4873/') const newPackageJsonString = fs.readFileSync(packageJsonPath, 'utf-8') const newPackageJson = JSON.parse(newPackageJsonString) console.log(`\n结束时间:${getNowTime()}`) console.log(`原版本号:${parsePackageJson.version}`) console.log(`新版本号:${newPackageJson.version}`) console.log(`处理结果:发布成功!`) } else { console.log(`正在删除中...\n`) exec( `npm unpublish ${parsePackageJson.name} --force --registry http://localhost:4873/` ) console.log(`\n结束时间:${getNowTime()}`) console.log(`处理结果:删除成功!`) } successCount++ subSuccessCount++ fs.appendFileSync( consoleLogPath, `[${index + 1}/${res.length}]${ isPublish ? '成功发布包' : '成功删除包' }->${dPath}:${parsePackageJson.name}@${ parsePackageJson.version } @${getNowTime()}\n` ) } catch (e) { console.log(e) console.log(`\n结束时间:${getNowTime()}`) if (isPublish) { console.log(`处理结果:已发布过/发布失败!`) } else { console.log(`处理结果:不存在/删除失败!`) } failedCount++ subFailCount++ failedList.push( `${dPath}:${parsePackageJson.name}@${ parsePackageJson.version } @${getNowTime()}\n` ) } } const subRes = fs.readdirSync(dPath) batchPublish(subRes, consoleLogPath, dPath, true) process.chdir(modulePath) console.log(`<--回到目录:${modulePath}`) } }) if (isSubDir) { console.log(`\n【---${getNowTime()}--子任务结束--exit-】\n`) console.log(`\n【子任务统计】:`) console.log(`总文件数:${res.length}`) console.log(`有 效 包:${subPacktotal}`) console.log(`处理成功:${subSuccessCount}`) console.log(`失败/不处理:${subFailCount}`) console.log(`耗 时:${subBeginTime} --> ${getNowTime()}`) console.log(`成 功 率:${(subSuccessCount / subPacktotal) * 100}%\n`) } else { console.log(`\n总任务已处理完毕,失败/不处理的包日志正在写入...\n`) if (failedList.length !== 0) { fs.appendFileSync(consoleLogPath, `失败日志列表:\n`) failedList.forEach((f, i) => { fs.appendFileSync( consoleLogPath, `${isPublish ? '发布失败' : '删除失败'}${i + 1}.${f}` ) }) } console.log(`【总任务统计】:`) console.log(`累计文件数:${total}`) console.log(`有 效 包:${packtotal}`) console.log(`处理成功:${successCount}`) console.log(`失败/不处理:${failedCount}`) console.log(`耗 时:${beginTime} --> ${getNowTime()}`) console.log(`成 功 率:${(successCount / packtotal) * 100}%`) console.log(`\n本次总任务已结束,退出-- over --------------------\n`) } } 转成java 代码

filetype

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <property name="log.path" value="logs/ruoyi-auth" /> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>60</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>60</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name="com.ruoyi" level="info" /> <logger name="org.springframework" level="warn" /> <root level="info"> <appender-ref ref="console" /> </root> <root level="info"> <appender-ref ref="file_info" /> <appender-ref ref="file_error" /> </root> </configuration> 这是我的日志文件

filetype

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <property name="log.path" value="logs/aerors-interpretation" /> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>60</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>60</maxHistory> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name="com.aerors" level="info" /> <logger name="org.springframework" level="warn" /> <root level="info"> <appender-ref ref="console" /> </root> <root level="info"> <appender-ref ref="file_info" /> <appender-ref ref="file_error" /> </root> </configuration> 这个基础上如何修改

filetype

<?xml version=“1.0” encoding=“UTF-8”?> <configuration scan=“true” scanPeriod=“60 seconds” debug=“false”> <springProperty scope=“context” name=“log.path” source=“log.path” defaultValue=“geochance-ddu”/> <property name=“log.pattern” value=“%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n” />:ss} %-5level ${springAppName:-} %thread %logger %msg%n"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>7</maxHistory> <totalSizeCap>2GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/debug.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/debug.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>7</maxHistory> <totalSizeCap>2GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>7</maxHistory> <totalSizeCap>100MB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name="com.geochance" level="info" /> <logger name="com.geochance" level="debug" /> <logger name="org.springframework" level="warn" /> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="file_info" /> <appender-ref ref="file_debug" /> <appender-ref ref="file_error" /> </root> </configuration> 这是我修改的配置信息,# Mybatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.geochance.ddu # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath:mapper/**/*.xml configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl 还是没有效果,没有办法将SQL日志输出到文件中呀

filetype

# spring spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:33605/cloud_fxqx?useCompression=true&protocolCompressionAlgorithms=zstd&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: Geochance@db*0311 hikari: minimum-idle: 5 maximum-pool-size: 5 # Mybatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.geochance.ddu # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath:mapper/**/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 这是我的数据源配置信息和Mybatis输出日志配置信息,项目中使用的是@sl4j的日志框架,并且有logback-spring.xml日志配置文件,且配置信息如下:<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <springProperty scope="context" name="log.path" source="log.path" defaultValue="geochance-ddu"/> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />:ss} %-5level ${springAppName:-} %thread %logger %msg%n"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>7</maxHistory> <totalSizeCap>2GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>7</maxHistory> <totalSizeCap>100MB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name="com.geochance" level="info" /> <logger name="org.springframework" level="warn" /> <root level="info"> <appender-ref ref="console" /> </root> <root level="info"> <appender-ref ref="file_info" /> <appender-ref ref="file_error" /> </root> </configuration>,我想知道为什么Mybatis的SQL输出时只在控制台输出,而没有在.log日志文件中输出,原因何在?如何调整,希望可以输出到.log日志文件中

weixin_39840914
  • 粉丝: 438
上传资源 快速赚钱