Skip to content

Commit 2683c9f

Browse files
committed
refactor: improve logging and task categorization
This commit refactors the logging system and task categorization within the application. The changes improve code organization, readability, and provide more context in log messages. Specifically, the ANSI color codes are moved to a dedicated Colors class, and task logging now includes color-coded task categories for better visual distinction. Additionally, several log messages have been adjusted to provide more relevant information and use more appropriate log levels. Finally, the docker-compose file is updated to improve container behavior.
1 parent 0242c45 commit 2683c9f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+320
-315
lines changed

docker/docker-compose.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ services:
1616
retries: 5
1717
networks:
1818
- rengine_network
19+
tty: true
1920

2021
redis:
2122
image: ghcr.io/security-tools-alliance/rengine-ng:rengine-redis-v${RENGINE_VERSION}
@@ -31,6 +32,7 @@ services:
3132
retries: 5
3233
networks:
3334
- rengine_network
35+
tty: true
3436

3537
celery:
3638
image: ghcr.io/security-tools-alliance/rengine-ng:rengine-celery-v${RENGINE_VERSION}
@@ -64,6 +66,7 @@ services:
6466
condition: service_healthy
6567
networks:
6668
- rengine_network
69+
tty: true
6770

6871
celery-beat:
6972
image: ghcr.io/security-tools-alliance/rengine-ng:rengine-celery-v${RENGINE_VERSION}
@@ -90,6 +93,7 @@ services:
9093
- wordlist:/home/rengine/wordlists
9194
networks:
9295
- rengine_network
96+
tty: true
9397

9498
web:
9599
image: ghcr.io/security-tools-alliance/rengine-ng:rengine-web-v${RENGINE_VERSION}
@@ -126,6 +130,7 @@ services:
126130
rengine_network:
127131
aliases:
128132
- rengine
133+
tty: true
129134

130135
proxy:
131136
image: ghcr.io/security-tools-alliance/rengine-ng:rengine-proxy-v${RENGINE_VERSION}
@@ -156,6 +161,7 @@ services:
156161
ports:
157162
- 8082:8082/tcp
158163
- 443:443/tcp
164+
tty: true
159165

160166
ollama:
161167
image: ghcr.io/security-tools-alliance/rengine-ng:rengine-ollama-v${RENGINE_VERSION}

web/api/views.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import logging
21
import re
32
import os.path
43
from pathlib import Path
@@ -25,6 +24,7 @@
2524

2625
from recon_note.models import TodoNote
2726
from reNgine.celery import app
27+
from reNgine.utils.logger import default_logger as logger
2828
from reNgine.utils.db import (
2929
get_lookup_keywords,
3030
)
@@ -126,8 +126,6 @@
126126
VulnerabilitySerializer
127127
)
128128

129-
logger = logging.getLogger(__name__)
130-
131129

132130
class OllamaManager(APIView):
133131
def get(self, request):
@@ -848,7 +846,7 @@ def post(self, request):
848846
SUCCESS_TASK)
849847
response['status'] = True
850848
except Exception as e:
851-
logging.error(e)
849+
logger.error(e)
852850
response = {'status': False, 'message': str(e)}
853851
elif scan_id:
854852
try:
@@ -864,7 +862,7 @@ def post(self, request):
864862
SUCCESS_TASK)
865863
response['status'] = True
866864
except Exception as e:
867-
logging.error(e)
865+
logger.error(e)
868866
response = {'status': False, 'message': str(e)}
869867

870868
logger.warning(f'Revoking tasks {task_ids}')

web/dashboard/views.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import json
2-
import logging
32

43
from datetime import timedelta
54

@@ -25,8 +24,8 @@
2524
from dashboard.models import Project, OpenAiAPIKey, NetlasAPIKey
2625
from dashboard.forms import ProjectForm
2726
from reNgine.definitions import PERM_MODIFY_SYSTEM_CONFIGURATIONS, FOUR_OH_FOUR_URL
27+
from reNgine.utils.logger import default_logger as logger
2828

29-
logger = logging.getLogger(__name__)
3029

3130
def index(request, slug):
3231
try:

web/reNgine/celery_custom_task.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import json
33

44
from celery import Task
5-
from celery.utils.log import get_task_logger
65
from celery.worker.request import Request
76
from django.utils import timezone
87
from redis import Redis
@@ -25,13 +24,12 @@
2524
get_task_cache_key,
2625
get_traceback_path
2726
)
27+
from reNgine.utils.logger import default_logger as logger
2828
from reNgine.utils.utils import format_json_output
2929

3030
from scanEngine.models import EngineType
3131
from startScan.models import ScanActivity, ScanHistory, SubScan
3232

33-
logger = get_task_logger(__name__)
34-
3533
cache = None
3634
if 'CELERY_BROKER' in os.environ:
3735
cache = Redis.from_url(os.environ['CELERY_BROKER'])
@@ -75,7 +73,6 @@ def __call__(self, *args, **kwargs):
7573
# Get task info
7674
self.task_name = self.name.split('.')[-1]
7775
self.description = kwargs.get('description') or ' '.join(self.task_name.split('_')).capitalize()
78-
logger = get_task_logger(self.task_name)
7976

8077
# Get reNgine context
8178
ctx = kwargs.get('ctx', {})
@@ -135,9 +132,9 @@ def __call__(self, *args, **kwargs):
135132
# Create ScanActivity for this task and send start scan notifs
136133
if self.track:
137134
if self.domain:
138-
logger.warning(f'Task {self.task_name} for {self.subdomain.name if self.subdomain else self.domain.name} is RUNNING')
135+
logger.info(f'Task {self.task_name} for {self.subdomain.name if self.subdomain else self.domain.name} is RUNNING')
139136
else:
140-
logger.warning(f'Task {self.task_name} is RUNNING')
137+
logger.info(f'Task {self.task_name} is RUNNING')
141138
self.create_scan_activity()
142139

143140
if RENGINE_CACHE_ENABLED:
@@ -148,9 +145,9 @@ def __call__(self, *args, **kwargs):
148145
self.status = SUCCESS_TASK
149146
if RENGINE_RECORD_ENABLED and self.track:
150147
if self.domain:
151-
logger.warning(f'Task {self.task_name} for {self.subdomain.name if self.subdomain else self.domain.name} status is SUCCESS (CACHED)')
148+
logger.info(f'Task {self.task_name} for {self.subdomain.name if self.subdomain else self.domain.name} status is SUCCESS (CACHED)')
152149
else:
153-
logger.warning(f'Task {self.task_name} status is SUCCESS (CACHED)')
150+
logger.info(f'Task {self.task_name} status is SUCCESS (CACHED)')
154151
self.update_scan_activity()
155152
return json.loads(result)
156153

@@ -186,7 +183,7 @@ def __call__(self, *args, **kwargs):
186183
else:
187184
msg = f'Task {self.task_name} status is {self.status_str}'
188185
msg += f' | Error: {self.error}' if self.error else ''
189-
logger.warning(msg)
186+
logger.info(msg)
190187
self.update_scan_activity()
191188

192189
# Set task result in cache if task was successful
@@ -208,7 +205,7 @@ def write_results(self):
208205
json.dump(self.result, f, indent=4)
209206
else:
210207
f.write(self.result)
211-
logger.warning(f'Wrote {self.task_name} results to {self.output_path}')
208+
logger.info(f'Wrote {self.task_name} results to {self.output_path}')
212209

213210
def create_scan_activity(self):
214211
if not self.track:
@@ -292,7 +289,7 @@ def get_from_cache(self, *args, **kwargs):
292289
if target:
293290
msg += f' for {target}'
294291
msg += ' status is SUCCESS (CACHED)'
295-
logger.warning(msg)
292+
logger.info(msg)
296293
self.update_scan_activity()
297294
return json.loads(result)
298295
return None

web/reNgine/common_views.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
from django.template import RequestContext
44
from django.utils.module_loading import import_string
55

6-
import logging
7-
8-
logger = logging.getLogger(__name__)
6+
from reNgine.utils.logger import default_logger as logger
7+
98

109
def permission_denied(request):
1110
logger.warning(f"Permission denied for user {request.user}")

web/reNgine/context_processors.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
from . import settings
22
import requests
33
from django.core.cache import cache
4-
import logging
4+
from reNgine.utils.logger import default_logger as logger
55

6-
logger = logging.getLogger(__name__)
76

87
def version(request):
98
return {"RENGINE_CURRENT_VERSION": settings.RENGINE_CURRENT_VERSION}
@@ -22,7 +21,7 @@ def misc(request):
2221
# Handle the exception if the request fails
2322
external_ip = 'Unable to retrieve IP' # Default value in case of error
2423
# You can also log the error if necessary
25-
logger.error(f"Error retrieving external IP: {e}")
24+
logger.exception(f"Error retrieving external IP: {e}")
2625

2726
return {
2827
'external_ip': external_ip

web/reNgine/gpt.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
from langchain_community.llms import Ollama
1111

1212
from dashboard.models import OllamaSettings
13-
import logging
13+
from reNgine.utils.logger import default_logger as logger
1414

15-
logger = logging.getLogger(__name__)
1615

1716
class GPTVulnerabilityReportGenerator:
1817

@@ -131,7 +130,7 @@ def get_attack_suggestion(self, input):
131130
'input': input
132131
}
133132
except ValueError as e:
134-
logger.error("Error in get_attack_suggestion: %s", str(e), exc_info=True)
133+
logger.exception(f"Error in get_attack_suggestion: {str(e)}")
135134
return {
136135
'status': False,
137136
'error': "An error occurred while processing your request.",

web/reNgine/init.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import logging
21
import secrets
32
import os
3+
from reNgine.utils.logger import default_logger as logger
44

5-
logger = logging.getLogger(__name__)
65

76

87
'''
@@ -19,11 +18,11 @@ def first_run(secret_file, base_dir):
1918
else:
2019
try:
2120
secret_key = get_random()
22-
secret = open(secret_file, 'w')
23-
secret.write(secret_key)
24-
secret.close()
25-
except OSError:
26-
raise Exception(f'Secret file generation failed. Path: {secret_file}')
21+
with open(secret_file, 'w') as secret:
22+
secret.write(secret_key)
23+
except OSError as e:
24+
logger.exception(f'Secret file generation failed. Path: {secret_file}')
25+
raise Exception(f'Secret file generation failed. Path: {secret_file}') from e
2726
return secret_key
2827

2928

web/reNgine/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ class SensitiveDataFilter(logging.Filter):
237237
def filter(self, record):
238238
sensitive_keys = [
239239
NETLAS_API_KEY,
240+
os.environ.get('AWS_ACCESS_KEY_ID'),
241+
os.environ.get('AWS_SECRET_ACCESS_KEY')
240242
]
241243

242244
for key in filter(None, sensitive_keys):

web/reNgine/tasks/command.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from reNgine.celery import app
22
from reNgine.utils.command_executor import run_command
3-
from reNgine.utils.logger import Logger
3+
from reNgine.utils.logger import default_logger as logger
44

5-
logger = Logger(True)
65

76
@app.task(name='run_command_line', bind=False, queue='run_command_queue')
87
def run_command_line(cmd, **kwargs):

web/reNgine/tasks/detect.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from reNgine.settings import RENGINE_TOOL_PATH
1313
from reNgine.tasks.command import run_command_line
1414
from reNgine.utils.command_builder import CommandBuilder, build_cmsseek_cmd, build_wafw00f_cmd
15-
from reNgine.utils.logger import Logger
15+
from reNgine.utils.logger import default_logger as logger
1616
from reNgine.utils.http import get_subdomain_from_url, prepare_urls_with_fallback
1717
from reNgine.utils.task_config import TaskConfig
1818

@@ -22,9 +22,6 @@
2222
Celery tasks.
2323
"""
2424

25-
logger = Logger(is_task_logger=True) # Use task logger for Celery tasks
26-
27-
2825
@app.task(name='waf_detection', queue='io_queue', base=RengineTask, bind=True)
2926
def waf_detection(self, ctx=None, description=None):
3027
"""
@@ -50,7 +47,7 @@ def waf_detection(self, ctx=None, description=None):
5047
ctx=ctx
5148
)
5249
if not urls:
53-
logger.error('🛡️ No URLs to check for WAF. Skipping.')
50+
logger.warning('🛡️ No URLs to check for WAF. Skipping.')
5451
return
5552

5653
run_command_line.delay(
@@ -92,7 +89,7 @@ def waf_detection(self, ctx=None, description=None):
9289
subdomain.waf.add(waf)
9390
subdomain.save()
9491
except Subdomain.DoesNotExist:
95-
logger.warning(f'🛡️ Subdomain {subdomain_name} was not found in the db, skipping waf detection.')
92+
logger.info(f'🛡️ Subdomain {subdomain_name} was not found in the db, skipping waf detection.')
9693

9794
return wafs
9895

@@ -123,12 +120,12 @@ def run_cmseek(url):
123120
try:
124121
shutil.rmtree(os.path.dirname(json_path))
125122
except Exception as e:
126-
logger.error(f"Error cleaning up CMSeeK results: {e}")
123+
logger.exception(f"Error cleaning up CMSeeK results: {e}")
127124

128125
return result
129126

130127
except Exception as e:
131-
logger.error(f"Error running CMSeeK: {e}")
128+
logger.exception(f"Error running CMSeeK: {e}")
132129
return {'status': False, 'message': str(e)}
133130

134131
@app.task(name='run_wafw00f', bind=False, queue='run_command_queue')
@@ -153,5 +150,5 @@ def run_wafw00f(url):
153150
logger.info("No WAF detected")
154151
return "No WAF detected"
155152
except Exception as e:
156-
logger.error(f"Unexpected error: {e}")
153+
logger.exception(f"Unexpected error: {e}")
157154
return f"Unexpected error: {str(e)}"

web/reNgine/tasks/dns.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from django.utils import timezone
33

44
from reNgine.celery import app
5-
from reNgine.utils.logger import Logger
5+
from reNgine.utils.logger import default_logger as logger
66
from reNgine.utils.dns import (
77
get_domain_info_from_db,
88
get_domain_historical_ip_address,
@@ -17,7 +17,6 @@
1717
Registrar,
1818
)
1919

20-
logger = Logger(True)
2120

2221
@app.task(name='query_whois', bind=False, queue='io_queue')
2322
def query_whois(ip_domain, force_reload_whois=False):
@@ -51,23 +50,23 @@ def query_whois(ip_domain, force_reload_whois=False):
5150
historical_ips = get_domain_historical_ip_address(ip_domain)
5251
domain_info.historical_ips = historical_ips
5352
except Exception as e:
54-
logger.error(f'HistoricalIP for {ip_domain} not found!\nError: {str(e)}')
53+
logger.exception(f'HistoricalIP for {ip_domain} not found!\nError: {str(e)}')
5554
historical_ips = []
5655

5756
# Step 2: Find associated domains using reverse whois
5857
try:
5958
related_domains = reverse_whois(ip_domain.split('.')[0])
6059
domain_info.related_domains = [domain['name'] for domain in related_domains]
6160
except Exception as e:
62-
logger.error(f'Associated domain not found for {ip_domain}\nError: {str(e)}')
61+
logger.exception(f'Associated domain not found for {ip_domain}\nError: {str(e)}')
6362
domain_info.related_domains = []
6463

6564
# Step 3: Find related TLDs
6665
try:
6766
related_tlds = find_related_tlds(ip_domain)
6867
domain_info.related_tlds = related_tlds
6968
except Exception as e:
70-
logger.error(f'Related TLDs not found for {ip_domain}\nError: {str(e)}')
69+
logger.exception(f'Related TLDs not found for {ip_domain}\nError: {str(e)}')
7170
domain_info.related_tlds = []
7271

7372
# Step 4: Execute WHOIS
@@ -76,7 +75,7 @@ def query_whois(ip_domain, force_reload_whois=False):
7675
# Update domain_info with whois data
7776
domain_info.update(whois_data)
7877
except Exception as e:
79-
logger.error(f'Error executing whois for {ip_domain}\nError: {str(e)}')
78+
logger.exception(f'Error executing whois for {ip_domain}\nError: {str(e)}')
8079

8180
# Step 5: Save information to database if we have a domain object
8281
if domain:

0 commit comments

Comments
 (0)