68 lines
2.1 KiB
Python
Executable File
68 lines
2.1 KiB
Python
Executable File
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()
|