diff --git a/Merge/back_wzy/routes/posts.py b/Merge/back_wzy/routes/posts.py
index 6fd2a89..4c89334 100644
--- a/Merge/back_wzy/routes/posts.py
+++ b/Merge/back_wzy/routes/posts.py
@@ -5,12 +5,39 @@
 from models.post   import Post
 from models.behavior import Behavior
 from utils.Fpost import Fpost
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+from config import Config
 import json
 
 posts_bp = Blueprint('posts', __name__)
 
+def safe_log(user_id, log_type, message, ip):
+    user_id=1
+    """安全的日志记录函数，不会影响主业务逻辑"""
+    try:
+        engine = create_engine(Config.SQLURL)
+        SessionLocal = sessionmaker(bind=engine)
+        session = SessionLocal()
+        f = Fpost(session)
+        f.recordlog(user_id, log_type, message, ip)
+    except Exception as e:
+        # 方法一：简单打印错误信息
+        print(f"[safe_log] 记录日志失败：{e}")
+        traceback.print_exc()  # 打印完整的堆栈跟踪
+
+        # 方法二：使用 logging 模块（推荐）
+        logger.exception("safe_log: 记录日志时发生异常")
+    finally:
+        # 确保 session 一定关闭
+        try:
+            session.close()
+        except Exception:
+            pass
+
 @posts_bp.route('', methods=['POST'])
 def create_post():
+    user_id = None
     try:
         # 获取文本字段
         user_id = request.form.get('user_id')
@@ -21,6 +48,7 @@
         media_count = int(request.form.get('media_count', 0))
         
         if not user_id or not title or not content:
+            safe_log(int(user_id) if user_id else 0, 'error', '创建帖子失败：缺少必要字段', request.remote_addr)
             return jsonify({'error': '缺少必要字段'}), 400
         
         # 获取上传的文件
@@ -41,9 +69,11 @@
             files=files
         )
         
+        safe_log(int(user_id), 'behavior', f'成功创建帖子，帖子ID: {new_post.id}，标题: {title}', request.remote_addr)
         return jsonify({'id': new_post.id}), 201
         
     except Exception as e:
+        safe_log(int(user_id) if user_id else 0, 'error', f'创建帖子时发生异常: {str(e)}', request.remote_addr)
         return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('', methods=['GET'])
@@ -53,38 +83,56 @@
       - GET /posts              返回所有已发布帖子
       - GET /posts?user_id=123  返回指定用户 user_id 的所有帖子
     """
-    user_id = request.args.get('user_id', type=int)
-    query = Post.query
-    if user_id is not None:
-        query = query.filter_by(user_id=user_id)
-    else:
-        query = query.filter_by(status='published')
+    user_id = None
+    try:
+        user_id = request.args.get('user_id', type=int)
+        query = Post.query
+        if user_id is not None:
+            query = query.filter_by(user_id=user_id)
+        else:
+            query = query.filter_by(status='published')
 
-    posts = query.all()
+        posts = query.all()
+        
+        log_msg = f'获取帖子列表成功，共{len(posts)}个帖子'
+        if user_id:
+            log_msg += f'，用户ID: {user_id}'
+        safe_log(user_id if user_id else 0, 'access', log_msg, request.remote_addr)
 
-    return jsonify([{
-        'id': p.id,
-        'title': p.title,
-        'status': p.status,                     # 新增 status 字段
-        'heat': p.heat,
-        'created_at': p.created_at.isoformat()
-    } for p in posts])
+        return jsonify([{
+            'id': p.id,
+            'title': p.title,
+            'status': p.status,
+            'heat': p.heat,
+            'created_at': p.created_at.isoformat()
+        } for p in posts])
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'获取帖子列表时发生异常: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>', methods=['GET'])
 def get_post(post_id):
-    post = Post.query.get_or_404(post_id)
-    return jsonify({
-        'id': post.id,
-        'user_id': post.user_id,
-        'topic_id': post.topic_id,
-        'title': post.title,
-        'content': post.content,
-        'media_urls': post.media_urls,
-        'status': post.status,
-        'heat': post.heat,
-        'created_at': post.created_at.isoformat(),
-        'updated_at': post.updated_at.isoformat()
-    })
+    try:
+        post = Post.query.get_or_404(post_id)
+        safe_log(0, 'access', f'获取帖子详情成功，帖子ID: {post_id}，标题: {post.title}', request.remote_addr)
+        
+        return jsonify({
+            'id': post.id,
+            'user_id': post.user_id,
+            'topic_id': post.topic_id,
+            'title': post.title,
+            'content': post.content,
+            'media_urls': post.media_urls,
+            'status': post.status,
+            'heat': post.heat,
+            'created_at': post.created_at.isoformat(),
+            'updated_at': post.updated_at.isoformat()
+        })
+        
+    except Exception as e:
+        safe_log(0, 'error', f'获取帖子详情时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>', methods=['PUT'])
 def update_post(post_id):
@@ -142,19 +190,28 @@
             updated_post = post
         
         if not updated_post:
+            safe_log(0, 'error', f'更新帖子失败，帖子不存在，帖子ID: {post_id}', request.remote_addr)
             return jsonify({'error': '帖子不存在'}), 404
-            
+        
+        safe_log(0, 'behavior', f'更新帖子成功，帖子ID: {post_id}', request.remote_addr)
         return '', 204
         
     except Exception as e:
+        safe_log(0, 'error', f'更新帖子时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
         return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>', methods=['DELETE'])
 def delete_post(post_id):
-    post = Post.query.get_or_404(post_id)
-    db.session.delete(post)
-    db.session.commit()
-    return '', 204
+    try:
+        post = Post.query.get_or_404(post_id)
+        db.session.delete(post)
+        db.session.commit()
+        safe_log(0, 'behavior', f'删除帖子成功，帖子ID: {post_id}', request.remote_addr)
+        return '', 204
+        
+    except Exception as e:
+        safe_log(0, 'error', f'删除帖子时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>/<action>', methods=['POST'])
 def post_action(post_id, action):
@@ -162,76 +219,105 @@
     支持的 action: like, favorite, view, share
     对于 like 和 favorite，保证每个用户每帖只做一次。
     """
-    if action not in ('like', 'favorite', 'view', 'share'):
-        abort(400, 'Invalid action')
+    user_id = None
+    try:
+        if action not in ('like', 'favorite', 'view', 'share'):
+            abort(400, 'Invalid action')
 
-    data = request.get_json() or {}
-    user_id = data.get('user_id')
-    if not user_id:
-        abort(400, 'user_id required')
+        data = request.get_json() or {}
+        user_id = data.get('user_id')
+        if not user_id:
+            safe_log(0, 'error', f'执行帖子操作失败，缺少用户ID，帖子ID: {post_id}，操作: {action}', request.remote_addr)
+            abort(400, 'user_id required')
 
-    # 对 like/favorite 做去重检查
-    if action in ('like', 'favorite'):
-        exists = Behavior.query.filter_by(
-            user_id=user_id,
-            post_id=post_id,
-            type=action
-        ).first()
-        if exists:
-            return jsonify({'error': f'already {action}d'}), 400
+        # 对 like/favorite 做去重检查
+        if action in ('like', 'favorite'):
+            exists = Behavior.query.filter_by(
+                user_id=user_id,
+                post_id=post_id,
+                type=action
+            ).first()
+            if exists:
+                safe_log(user_id, 'error', f'重复执行帖子操作，帖子ID: {post_id}，操作: {action}', request.remote_addr)
+                return jsonify({'error': f'already {action}d'}), 400
 
-    # 创建行为记录
-    beh = Behavior(user_id=user_id, post_id=post_id, type=action)
-    db.session.add(beh)
+        # 创建行为记录
+        beh = Behavior(user_id=user_id, post_id=post_id, type=action)
+        db.session.add(beh)
 
-    # 更新热度
-    post = Post.query.get_or_404(post_id)
-    post.heat += 1
+        # 更新热度
+        post = Post.query.get_or_404(post_id)
+        post.heat += 1
 
-    db.session.commit()
-    return '', 201
+        db.session.commit()
+        safe_log(user_id, 'behavior', f'执行帖子操作成功，帖子ID: {post_id}，操作: {action}', request.remote_addr)
+        return '', 201
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'执行帖子操作时发生异常，帖子ID: {post_id}，操作: {action}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>/like', methods=['DELETE'])
 def unlike(post_id):
-    user_id = request.get_json(silent=True) and request.get_json().get('user_id')
-    if not user_id:
-        abort(400, 'user_id required')
-    # 查找已有的 like 行为
-    beh = Behavior.query.filter_by(
-        user_id=user_id,
-        post_id=post_id,
-        type='like'
-    ).first()
-    if not beh:
-        return jsonify({'error': 'not liked yet'}), 400
+    user_id = None
+    try:
+        user_id = request.get_json(silent=True) and request.get_json().get('user_id')
+        if not user_id:
+            safe_log(0, 'error', f'取消点赞失败，缺少用户ID，帖子ID: {post_id}', request.remote_addr)
+            abort(400, 'user_id required')
+            
+        # 查找已有的 like 行为
+        beh = Behavior.query.filter_by(
+            user_id=user_id,
+            post_id=post_id,
+            type='like'
+        ).first()
+        if not beh:
+            safe_log(user_id, 'error', f'取消点赞失败，用户尚未点赞，帖子ID: {post_id}', request.remote_addr)
+            return jsonify({'error': 'not liked yet'}), 400
 
-    db.session.delete(beh)
-    # 更新热度，确保不降到负数
-    post = Post.query.get_or_404(post_id)
-    post.heat = max(post.heat - 1, 0)
-    db.session.commit()
-    return '', 204
+        db.session.delete(beh)
+        # 更新热度，确保不降到负数
+        post = Post.query.get_or_404(post_id)
+        post.heat = max(post.heat - 1, 0)
+        db.session.commit()
+        safe_log(user_id, 'behavior', f'取消点赞成功，帖子ID: {post_id}', request.remote_addr)
+        return '', 204
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'取消点赞时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>/favorite', methods=['DELETE'])
 def unfavorite(post_id):
-    user_id = request.get_json(silent=True) and request.get_json().get('user_id')
-    if not user_id:
-        abort(400, 'user_id required')
-    # 查找已有的 favorite 行为
-    beh = Behavior.query.filter_by(
-        user_id=user_id,
-        post_id=post_id,
-        type='favorite'
-    ).first()
-    if not beh:
-        return jsonify({'error': 'not favorited yet'}), 400
+    user_id = None
+    try:
+        user_id = request.get_json(silent=True) and request.get_json().get('user_id')
+        if not user_id:
+            safe_log(0, 'error', f'取消收藏失败，缺少用户ID，帖子ID: {post_id}', request.remote_addr)
+            abort(400, 'user_id required')
+            
+        # 查找已有的 favorite 行为
+        beh = Behavior.query.filter_by(
+            user_id=user_id,
+            post_id=post_id,
+            type='favorite'
+        ).first()
+        if not beh:
+            safe_log(user_id, 'error', f'取消收藏失败，用户尚未收藏，帖子ID: {post_id}', request.remote_addr)
+            return jsonify({'error': 'not favorited yet'}), 400
 
-    db.session.delete(beh)
-    # 更新热度
-    post = Post.query.get_or_404(post_id)
-    post.heat = max(post.heat - 1, 0)
-    db.session.commit()
-    return '', 204
+        db.session.delete(beh)
+        # 更新热度
+        post = Post.query.get_or_404(post_id)
+        post.heat = max(post.heat - 1, 0)
+        db.session.commit()
+        safe_log(user_id, 'behavior', f'取消收藏成功，帖子ID: {post_id}', request.remote_addr)
+        return '', 204
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'取消收藏时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>/like/status', methods=['GET'])
 def has_liked(post_id):
@@ -240,14 +326,22 @@
     GET /posts/<post_id>/like/status?user_id=123
     返回 { "liked": true } 或 { "liked": false }
     """
-    user_id = request.args.get('user_id', type=int)
-    if not user_id:
-        abort(400, 'user_id required')
+    user_id = None
+    try:
+        user_id = request.args.get('user_id', type=int)
+        if not user_id:
+            safe_log(0, 'error', f'检查点赞状态失败，缺少用户ID，帖子ID: {post_id}', request.remote_addr)
+            abort(400, 'user_id required')
 
-    exists = Behavior.query.filter_by(
-        user_id=user_id,
-        post_id=post_id,
-        type='like'
-    ).first() is not None
-
-    return jsonify({'liked': exists}), 200
+        exists = Behavior.query.filter_by(
+            user_id=user_id,
+            post_id=post_id,
+            type='like'
+        ).first() is not None
+        
+        safe_log(user_id, 'access', f'检查点赞状态成功，帖子ID: {post_id}，结果: {exists}', request.remote_addr)
+        return jsonify({'liked': exists}), 200
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'检查点赞状态时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
