Skip to content

Commit 0549c21

Browse files
committed
Added logging and replaced all print statements with logger
1 parent f7ba2c9 commit 0549c21

17 files changed

Lines changed: 182 additions & 91 deletions

File tree

backend/app/db/vector_store.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222

2323
import os
2424
from pinecone import Pinecone, ServerlessSpec, CloudProvider, AwsRegion
25+
from app.logging.logging_config import setup_logger
26+
27+
28+
logger = setup_logger(__name__)
2529

2630
# Load Pinecone credentials from environment variables
2731
PINECONE_API_KEY = os.getenv("PINECONE_API_KEY")
@@ -41,15 +45,15 @@
4145

4246
# Create index if it doesn't exist
4347
if not pc.has_index(INDEX_NAME):
44-
print(f"Creating index: {INDEX_NAME}")
48+
logger.info(f"Creating index: {INDEX_NAME}")
4549
pc.create_index(
4650
name=INDEX_NAME,
4751
dimension=DIMENSIONS,
4852
metric=METRIC,
4953
spec=ServerlessSpec(cloud=CloudProvider.AWS, region=AwsRegion.US_EAST_1),
5054
)
5155
else:
52-
print(f"Index '{INDEX_NAME}' already exists")
56+
logger.info(f"Index '{INDEX_NAME}' already exists")
5357

5458
try:
5559
# Connect to the index
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import logging
2+
import sys
3+
4+
def setup_logger(name: str) -> logging.Logger:
5+
"""
6+
Creates and configures a logger with console + file output.
7+
8+
Args:
9+
name (str): The logger's name (usually __name__ of the calling module).
10+
11+
Returns:
12+
logging.Logger: Configured logger instance.
13+
"""
14+
logger = logging.getLogger(name)
15+
logger.setLevel(logging.DEBUG) # Log everything from DEBUG and above
16+
17+
# Avoid adding duplicate handlers if logger already set
18+
if logger.handlers:
19+
return logger
20+
21+
# Formatter with timestamp, log level, module name
22+
formatter = logging.Formatter(
23+
"[%(asctime)s] [%(levelname)s] [%(name)s]: %(message)s",
24+
datefmt="%Y-%m-%d %H:%M:%S"
25+
)
26+
27+
# Console Handler
28+
console_handler = logging.StreamHandler(sys.stdout)
29+
console_handler.setLevel(logging.INFO)
30+
console_handler.setFormatter(formatter)
31+
logger.addHandler(console_handler)
32+
33+
# File Handler
34+
file_handler = logging.FileHandler("app.log")
35+
file_handler.setLevel(logging.DEBUG) # Keep detailed logs in file
36+
file_handler.setFormatter(formatter)
37+
logger.addHandler(file_handler)
38+
39+
return logger

backend/app/modules/bias_detection/check_bias.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
from groq import Groq
2727
from dotenv import load_dotenv
2828
import json
29+
from app.logging.logging_config import setup_logger
30+
31+
logger = setup_logger(__name__)
2932

3033
load_dotenv()
3134

@@ -34,10 +37,11 @@
3437

3538
def check_bias(text):
3639
try:
37-
print(text)
38-
print(json.dumps(text))
40+
logger.debug(f"Raw article text: {text}")
41+
logger.debug(f"JSON dump of text: {json.dumps(text)}")
3942

4043
if not text:
44+
logger.error("Missing or empty 'cleaned_text'")
4145
raise ValueError("Missing or empty 'cleaned_text'")
4246

4347
chat_completion = client.chat.completions.create(
@@ -61,16 +65,16 @@ def check_bias(text):
6165
temperature=0.3,
6266
max_tokens=512,
6367
)
64-
6568
bias_score = chat_completion.choices[0].message.content.strip()
69+
logger.info(f"Bias score calculated: {bias_score}")
6670

6771
return {
6872
"bias_score": bias_score,
6973
"status": "success",
7074
}
7175

7276
except Exception as e:
73-
print(f"Error in bias_detection: {e}")
77+
logger.exception("Error in bias detection")
7478
return {
7579
"status": "error",
7680
"error_from": "bias_detection",

backend/app/modules/chat/llm_processing.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import os
2727
from groq import Groq
2828
from dotenv import load_dotenv
29+
from app.logging.logging_config import setup_logger
30+
31+
logger = setup_logger(__name__)
2932

3033
load_dotenv()
3134

@@ -41,7 +44,7 @@ def build_context(docs):
4144

4245
def ask_llm(question, docs):
4346
context = build_context(docs)
44-
print(context)
47+
logger.debug(f"Generated context for LLM:\n{context}")
4548
prompt = f"""You are an assistant that answers based on context.
4649
4750
Context:
@@ -58,5 +61,5 @@ def ask_llm(question, docs):
5861
{"role": "user", "content": prompt},
5962
],
6063
)
61-
64+
logger.info("LLM response retrieved successfully.")
6265
return response.choices[0].message.content

backend/app/modules/facts_check/llm_processing.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
from dotenv import load_dotenv
2929
import json
3030
import re
31+
from app.logging.logging_config import setup_logger
32+
33+
logger = setup_logger(__name__)
3134

3235
load_dotenv()
3336

@@ -66,6 +69,8 @@ def run_claim_extractor_sdk(state):
6669
)
6770

6871
extracted_claims = chat_completion.choices[0].message.content.strip()
72+
logger.debug(f"Extracted claims:\n{extracted_claims}")
73+
6974

7075
return {
7176
**state,
@@ -74,7 +79,7 @@ def run_claim_extractor_sdk(state):
7479
}
7580

7681
except Exception as e:
77-
print(f"Error in claim_extraction: {e}")
82+
logger.exception("Error in claim_extraction")
7883
return {
7984
"status": "error",
8085
"error_from": "claim_extraction",
@@ -132,13 +137,13 @@ def run_fact_verifier_sdk(search_results):
132137

133138
# Strip markdown code blocks if present
134139
content = re.sub(r"^```json|```$", "", content).strip()
135-
print(content)
140+
logger.debug(f"Raw LLM fact verification output:\n{content}")
136141

137142
# Try parsing the JSON response
138143
try:
139144
parsed = json.loads(content)
140145
except Exception as parse_err:
141-
print(f"LLM JSON parse error: {parse_err}")
146+
logger.error(f"LLM JSON parse error: {parse_err}")
142147

143148
results_list.append(parsed)
144149

@@ -149,7 +154,7 @@ def run_fact_verifier_sdk(search_results):
149154
}
150155

151156
except Exception as e:
152-
print(f"🔥 Error in fact_verification: {e}")
157+
logger.exception("Error in fact_verification")
153158
return {
154159
"status": "error",
155160
"error_from": "fact_verification",

backend/app/modules/langgraph_nodes/error_handler.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@
1313
"""
1414

1515

16+
from app.logging.logging_config import setup_logger
17+
18+
logger = setup_logger(__name__)
19+
20+
1621
def error_handler(input):
17-
print("Error detected!")
18-
print(f"From: {input.get('error_from')}")
19-
print(f"Message: {input.get('message')}")
22+
error_from = input.get("error_from", "Unknown source")
23+
message = input.get("message", "No message provided")
24+
logger.error(f"Error detected from '{error_from}': {message}")
2025

2126
return {
2227
"status": "stopped_due_to_error",

backend/app/modules/langgraph_nodes/fact_check.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616

1717

1818
from app.utils.fact_check_utils import run_fact_check_pipeline
19+
from app.logging.logging_config import setup_logger
20+
21+
logger = setup_logger(__name__)
22+
1923

2024

2125
def run_fact_check(state):
@@ -28,15 +32,15 @@ def run_fact_check(state):
2832
verifications, error_message = run_fact_check_pipeline(state)
2933

3034
if error_message:
31-
print(f"some error occured in fact_checking:{error_message}")
35+
logger.error(f"Error in fact-checking: {error_message}")
3236
return {
3337
"status": "error",
3438
"error_from": "fact_checking",
3539
"message": f"{error_message}",
3640
}
3741

3842
except Exception as e:
39-
print(f"some error occured in fact_checking:{e}")
43+
logger.exception(f"Unexpected error in fact-checking: {e}")
4044
return {
4145
"status": "error",
4246
"error_from": "fact_checking",

backend/app/modules/langgraph_nodes/generate_perspective.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
from app.utils.prompt_templates import generation_prompt
2424
from langchain_groq import ChatGroq
2525
from pydantic import BaseModel, Field
26+
from app.logging.logging_config import setup_logger
27+
28+
logger = setup_logger(__name__)
2629

2730

2831
prompt = generation_prompt
@@ -73,7 +76,7 @@ def generate_perspective(state):
7376
}
7477
)
7578
except Exception as e:
76-
print(f"some error occured in generate_perspective:{e}")
79+
logger.exception(f"Error in generate_perspective: {e}")
7780
return {
7881
"status": "error",
7982
"error_from": "generate_perspective",

backend/app/modules/langgraph_nodes/judge.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import re
1919
from langchain_groq import ChatGroq
2020
from langchain.schema import HumanMessage
21+
from app.logging.logging_config import setup_logger
22+
23+
logger = setup_logger(__name__)
2124

2225
# Init once
2326
groq_llm = ChatGroq(
@@ -62,7 +65,7 @@ def judge_perspective(state):
6265
return {**state, "score": score, "status": "success"}
6366

6467
except Exception as e:
65-
print(f"Error in judge_perspective: {e}")
68+
logger.exception(f"Error in judge_perspective: {e}")
6669
return {
6770
"status": "error",
6871
"error_from": "judge_perspective",

backend/app/modules/langgraph_nodes/sentiment.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import os
1818
from groq import Groq
1919
from dotenv import load_dotenv
20+
from app.logging.logging_config import setup_logger
21+
22+
logger = setup_logger(__name__)
2023

2124
load_dotenv()
2225

@@ -61,7 +64,7 @@ def run_sentiment_sdk(state):
6164
}
6265

6366
except Exception as e:
64-
print(f"Error in sentiment_analysis: {e}")
67+
logger.exception(f"Error in sentiment_analysis: {e}")
6568
return {
6669
"status": "error",
6770
"error_from": "sentiment_analysis",

0 commit comments

Comments
 (0)