import logging from logging.handlers import TimedRotatingFileHandler import re import pytz from datetime import datetime def get_logger(logger_name, log_file, when='midnight', backup_count=7): """ 配置日志记录器并返回 :param logger_name: 日志记录器名称 :param log_file: 日志文件路径 :param when: 日志滚动的时间间隔(默认:'midnight',即每天午夜滚动) :param backup_count: 保留的日志文件备份数量 :return: 配置好的日志记录器 """ logger = logging.getLogger(logger_name) logger.setLevel(logging.INFO) # 创建文件处理器,用于写入日志文件 handler = TimedRotatingFileHandler(log_file, when=when, backupCount=backup_count) handler.setLevel(logging.INFO) # 创建日志格式化器 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # 将处理器添加到记录器中 if not logger.hasHandlers(): logger.addHandler(handler) return logger def get_client_ip(request): """获取客户端真实 IP 地址""" x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip_list = x_forwarded_for.split(',') ip = ip_list[0] else: ip = request.META.get('REMOTE_ADDR', '') return ip def get_browser_language(request): """获取浏览器语言""" return request.META.get('HTTP_ACCEPT_LANGUAGE', '') def get_referrer(request): """获取来源 URL""" return request.META.get('HTTP_REFERER', '直接访问') def get_user_agent(request): """获取用户代理字符串""" return request.META.get('HTTP_USER_AGENT', '') def get_device_type(user_agent): """根据用户代理判断设备类型(手机或电脑)""" mobile_patterns = ['Mobile', 'Android', 'iPhone', 'iPad', 'Windows Phone'] for pattern in mobile_patterns: if re.search(pattern, user_agent, re.IGNORECASE): return 'Mobile' return 'Desktop' def get_beijing_time(utc_time): return datetime.now()