python_logging模块

         软件开发中通过日志记录程序的运行情况是一个开发的好习惯,对于错误排查和系统运维都有很大帮助。
Python标准库自带日志模块,程序的日志功能直接调用标准库的日志模块即可通过日志,开发者可以清楚地了解发生了哪些事件,包括出现了哪些错误。
 

logging.level(message)     --->>    创建一条level级别的日志

logging.basicConfig()        -->>     对logger进行配置

 

先写个小例子:

import logging

### Formatter格式
#   %(asctime)s        日志事件发生的时间
#   %(levelname)s      该日志记录的日志级别
#   %(message)s        日志记录的文本内容
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"  # 设置输出的格式
logging.basicConfig(level=logging.WARNING, format=LOG_FORMAT)  # 记录显示哪个等级以上的日志


logging.debug('This is a debug log')
logging.info('This is a info log')
logging.warning('This is a warning log')
logging.error('This is a error log')
logging.critical('This is a critical log')

运行结果

 

 到这里, 大家就有个简单的认识了。现在只是输出在控制台,后面我们还需要用Formatter格式输入log到文本。

日志等级

 Logging 中几种级别:DEBUG < INFO < WARNING < ERROR < CRITICAL

日志等级(level

描述

DEBUG

调试信息,通常在诊断问题的时候用得着

INFO

普通信息,确认程序按照预期运行

WARNING

警告信息,表示发生意想不到的事情,或者指示接下来可能会出现一些问题,但是程序还是继续运行   

ERROR

错误信息,程序运行中出现了一些问题,程序某些功能不能执行

CRITICAL

危险信息,一个严重的错误,导致程序无法继续运行

 

 

Formatter格式

%(asctime)s

日志事件发生的时间

%(levelname)s

该日志记录的日志级别

%(message)s

日志记录的文本内容

%(name)s

所使用的日志器名称,默认是'root'

%(pathname)s

调用日志记录函数的文件的全路径

%(filename)s

调用日志记录函数的文件

%(funcName)s

调用日志记录函数的函数名

%(lineno)d

调用日志记录函数的代码所在的行号

 

 

    如果只是简单地使用logging,那么使用上面介绍的方法就可以了,如果要深度定制logging,那么久需要对它有更深入的了解

    logging模块还提供了模块化组建的方法,来灵活配置日志器

 

组件

说明

Loggers(日志记录器)

提供程序直接使用的接口

Handlers(日志处理器)

将记录的日志发送到指定的位置

Filters(日志过滤器)

用于过滤特定的日志记录

Formatters(日志格式器)

用于控制日志信息的输出格式

 

说了这么多,模块组件是怎么使用的呢?

 

模块化组件的使用

1.创建一个logger(日志处理器)对象

2.定义handler(日志处理器),决定把日志发到哪里          

常用的是

StreamHandler     ->  输出到控制台

FileHandler           ->  输出到文件

3.设置日志级别(level)和输出格式Formatters(日志格式器)
4.把handler添加到对应的logger中去
 
 
到这里,直接写个小案例:
import logging

# 第一步, 创建一个logger
logger = logging.getLogger("%s_log" % __name__)
logger.setLevel(logging.INFO)  # 设置日志等级

# 第二步,创建一个handler, 用于写入日志文件
# logging.StreamHandler()    # 输出在控制台
fh = logging.FileHandler('test.log')  # 输出到文件 

# 第三步,定义handler的输出格式           Formatte 用于控制日志信息的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s [line:%(lineno)d]- %(levelname)s : %(message)s")
fh.setFormatter(formatter)   # 把格式器应用到handler中去

# 第四步,将对应的hangler添加在logger对象中
logger.addHandler(fh)

这里还不能直接运行,我们还需要应用一下:

try:
    1/0
except ZeroDivisionError as c:
    logger.warning('This is a warning log')

 

到这里,就算结束啦,运行看下结果:

xshell 进入 test.log 所在文件夹,vim test.log 进入文件

 

 到这里,还不算结束, 哈哈!!!

还可以封装logging, 当当!

# __author__ = " Caric Lee "
import logging, time, os
# 这个是日志保存本地的路径
log_path = "D:/log"

class Log:
    def __init__(self):
        # 文件的命名
        self.logname = os.path.join(log_path, '%s.log'%time.strftime('%Y_%m_%d'))
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.DEBUG)
        # 日志输出格式
        self.formatter = logging.Formatter('[%(asctime)s] -  %(filename)s[line:%(lineno)d] - fuc:%(funcName)s- %(levelname)s:  %(message)s')
    def __console(self, level, message):
        # 创建一个FileHandler,用于写到本地
        fh = logging.FileHandler(self.logname, 'a', encoding='utf-8')  # 追加模式   # 第一次执行log执行编码问题,在定义Filehandler时指定encoding
        fh.setLevel(logging.DEBUG)
        fh.setFormatter(self.formatter)
        self.logger.addHandler(fh)

        # 创建一个StreamHandler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)

        if level == 'info':
            self.logger.info(message)
        elif level == 'debug':
            self.logger.debug(message)
        elif level == 'warning':
            self.logger.warning(message)
        elif level == 'error':
            self.logger.error(message)
        # 这两行代码是为了避免日志输出重复问题
        self.logger.removeHandler(ch)
        self.logger.removeHandler(fh)
        # 关闭打开的文件
        fh.close()

    def debug(self, message):
        self.__console('debug', message)

    def info(self, message):
        self.__console('info', message)

    def warning(self, message):
        self.__console('warning', message)

    def error(self, message):
        self.__console('error', message)

if __name__ == "__main__":
   log = Log()
   log.info("---测试开始----")
   log.info("输入密码")
   log.warning("----测试结束----")

 

 到这真的结束了。

 
 

作者:含笑半步颠√

博客链接:https://www.cnblogs.com/lixy-88428977

声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。

转载于:https://www.cnblogs.com/lixy-88428977/p/9595361.html

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值