Repository: griptape-ai/griptape (language: python)

Issue:
Suppress logs for inputs and outputs on stdout
 - [x] I have read and agree to the [contributing guidelines](https://github.com/griptape-ai/griptape#contributing).

**Is your feature request related to a problem? Please describe.**
I dont want always see the inputs and outputs of all tasks that are running. If I am doing webscraping, for example, the entire webscraped output being printed multiple times on stdout is not useful.

**Describe the solution you'd like**
toggle the input and output logging for tasks. we currently allow overriding of a log level or the entire logger, but its not entirely clear how I would leverage that for this case. 

probably not implemented this way but this is what i am currently doing:
```
class BaseTask(ABC):
    .....
    log_input: bool = field(default=True, kw_only=True)
    log_output: bool = field(default=True, kw_only=True)
    
```
and in the various `Task`s that  the inputs/outputs are logged:
```
    def before_run(self) -> None:
        super().before_run()

        self.structure.logger.info(
            f"{self.__class__.__name__} {self.id}\nInput: {self.input.to_text() if self.log_input else self.input.name}"
        )

    def after_run(self) -> None:
        super().after_run()

        self.structure.logger.info(
            f"{self.__class__.__name__} {self.id}\nOutput: {self.output.to_text() if self.log_output else self.output.name}"
        )
```



**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8b69e7f32..ca7c663ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - **BREAKING**: Removed `Structure.embedding_driver`, set this via `griptape.config.config.drivers.embedding` instead.
 - **BREAKING**: Removed `Structure.custom_logger` and `Structure.logger_level`, set these via `griptape.config.config.logger` instead. 
 - **BREAKING**: Removed `BaseStructureConfig.merge_config`.
-- **BREAKING**: Renamed `StructureConfig` to `DriverConfig`, and renamed fields accordingly.
+- **BREAKING**: Renamed `StructureConfig` to `DriverConfig`, moved to `griptape.config.drivers` and renamed fields accordingly.
 - **BREAKING**: `RagContext.output` was changed to `RagContext.outputs` to support multiple outputs. All relevant RAG modules were adjusted accordingly.
 - **BREAKING**: Removed before and after response modules from `ResponseRagStage`.
 - **BREAKING**: Moved ruleset and metadata ingestion from standalone modules to `PromptResponseRagModule`.
diff --git a/docs/examples/src/multiple_agent_shared_memory_1.py b/docs/examples/src/multiple_agent_shared_memory_1.py
index e156e531a..11590df39 100644
--- a/docs/examples/src/multiple_agent_shared_memory_1.py
+++ b/docs/examples/src/multiple_agent_shared_memory_1.py
@@ -1,6 +1,7 @@
 import os
 
-from griptape.config import AzureOpenAiDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import AzureOpenAiDriverConfig
 from griptape.drivers import AzureMongoDbVectorStoreDriver, AzureOpenAiEmbeddingDriver
 from griptape.structures import Agent
 from griptape.tools import TaskMemoryTool, WebScraperTool
diff --git a/docs/examples/src/talk_to_a_video_1.py b/docs/examples/src/talk_to_a_video_1.py
index 3538c9071..377e177a6 100644
--- a/docs/examples/src/talk_to_a_video_1.py
+++ b/docs/examples/src/talk_to_a_video_1.py
@@ -3,7 +3,8 @@
 import google.generativeai as genai
 
 from griptape.artifacts import GenericArtifact, TextArtifact
-from griptape.config import GoogleDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import GoogleDriverConfig
 from griptape.structures import Agent
 
 config.drivers = GoogleDriverConfig()
diff --git a/docs/griptape-framework/drivers/src/embedding_drivers_10.py b/docs/griptape-framework/drivers/src/embedding_drivers_10.py
index 4f7560c99..a27e60298 100644
--- a/docs/griptape-framework/drivers/src/embedding_drivers_10.py
+++ b/docs/griptape-framework/drivers/src/embedding_drivers_10.py
@@ -1,4 +1,5 @@
-from griptape.config import DriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import (
     OpenAiChatPromptDriver,
     VoyageAiEmbeddingDriver,
diff --git a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py
index a70e05d79..7a0957e63 100644
--- a/docs/griptape-framework/drivers/src/event_listener_drivers_4.py
+++ b/docs/griptape-framework/drivers/src/event_listener_drivers_4.py
@@ -1,6 +1,7 @@
 import os
 
-from griptape.config import DriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import AwsIotCoreEventListenerDriver, OpenAiChatPromptDriver
 from griptape.events import EventListener, FinishStructureRunEvent, event_bus
 from griptape.rules import Rule
diff --git a/docs/griptape-framework/structures/config.md b/docs/griptape-framework/structures/config.md
index 89399f60c..67721ebb1 100644
--- a/docs/griptape-framework/structures/config.md
+++ b/docs/griptape-framework/structures/config.md
@@ -5,15 +5,17 @@ search:
 
 ## Overview
 
-The [DriverConfig](../../reference/griptape/config/driver_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. 
+Griptape exposes global configuration options to easily customize different parts of the framework.
 
-### Premade Configs
+### Driver Configs
 
-Griptape provides predefined [DriverConfig](../../reference/griptape/config/driver_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers.
+The [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) class allows for the customization of Structures within Griptape, enabling specific settings such as Drivers to be defined for Tasks. 
+
+Griptape provides predefined [DriverConfig](../../reference/griptape/config/drivers/driver_config.md)'s for widely used services that provide APIs for most Driver types Griptape offers.
 
 #### OpenAI
 
-The [OpenAI Driver config](../../reference/griptape/config/openai_driver_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures.
+The [OpenAI Driver config](../../reference/griptape/config/drivers/openai_driver_config.md) provides default Drivers for OpenAI's APIs. This is the default config for all Structures.
 
 ```python
 --8<-- "docs/griptape-framework/structures/src/config_1.py"
@@ -21,21 +23,21 @@ The [OpenAI Driver config](../../reference/griptape/config/openai_driver_config.
 
 #### Azure OpenAI
 
-The [Azure OpenAI Driver config](../../reference/griptape/config/azure_openai_driver_config.md) provides default Drivers for Azure's OpenAI APIs.
+The [Azure OpenAI Driver config](../../reference/griptape/config/drivers/azure_openai_driver_config.md) provides default Drivers for Azure's OpenAI APIs.
 
 ```python
 --8<-- "docs/griptape-framework/structures/src/config_2.py"
 ```
 
 #### Amazon Bedrock
-The [Amazon Bedrock Driver config](../../reference/griptape/config/amazon_bedrock_driver_config.md) provides default Drivers for Amazon Bedrock's APIs.
+The [Amazon Bedrock Driver config](../../reference/griptape/config/drivers/amazon_bedrock_driver_config.md) provides default Drivers for Amazon Bedrock's APIs.
 
 ```python
 --8<-- "docs/griptape-framework/structures/src/config_3.py"
 ```
 
 #### Google
-The [Google Driver config](../../reference/griptape/config/google_driver_config.md) provides default Drivers for Google's Gemini APIs.
+The [Google Driver config](../../reference/griptape/config/drivers/google_driver_config.md) provides default Drivers for Google's Gemini APIs.
 
 ```python
 --8<-- "docs/griptape-framework/structures/src/config_4.py"
@@ -43,7 +45,7 @@ The [Google Driver config](../../reference/griptape/config/google_driver_config.
 
 #### Anthropic
 
-The [Anthropic Driver config](../../reference/griptape/config/anthropic_driver_config.md) provides default Drivers for Anthropic's APIs.
+The [Anthropic Driver config](../../reference/griptape/config/drivers/anthropic_driver_config.md) provides default Drivers for Anthropic's APIs.
 
 !!! info
     Anthropic does not provide an embeddings API which means you will need to use another service for embeddings.
@@ -56,22 +58,30 @@ The [Anthropic Driver config](../../reference/griptape/config/anthropic_driver_c
 
 #### Cohere
 
-The [Cohere Driver config](../../reference/griptape/config/cohere_driver_config.md) provides default Drivers for Cohere's APIs.
+The [Cohere Driver config](../../reference/griptape/config/drivers/cohere_driver_config.md) provides default Drivers for Cohere's APIs.
 
 ```python
 --8<-- "docs/griptape-framework/structures/src/config_6.py"
 ```
 
-### Custom Configs
+#### Custom
 
-You can create your own [DriverConfig](../../reference/griptape/config/driver_config.md) by overriding relevant Drivers.
-The [DriverConfig](../../reference/griptape/config/driver_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. 
+You can create your own [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) by overriding relevant Drivers.
+The [DriverConfig](../../reference/griptape/config/drivers/driver_config.md) class includes "Dummy" Drivers for all types, which throw a [DummyError](../../reference/griptape/exceptions/dummy_exception.md) if invoked without being overridden. 
 This approach ensures that you are informed through clear error messages if you attempt to use Structures without proper Driver configurations.
 
 ```python
 --8<-- "docs/griptape-framework/structures/src/config_7.py"
 ```
 
+### Logging Config
+
+Griptape provides a predefined [LoggingConfig](../../reference/griptape/config/logging/logging_config.md)'s for easily customizing the logging events that the framework emits. In order to customize the logger, the logger can be fetched by using the `config.logging.logger_name`.
+
+```python
+--8<-- "docs/griptape-framework/structures/src/config_logging.py"
+```
+
 ### Loading/Saving Configs
 
 ```python
diff --git a/docs/griptape-framework/structures/src/config_1.py b/docs/griptape-framework/structures/src/config_1.py
index 0c7a5ed9e..df75488dc 100644
--- a/docs/griptape-framework/structures/src/config_1.py
+++ b/docs/griptape-framework/structures/src/config_1.py
@@ -1,4 +1,5 @@
-from griptape.config import OpenAiDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import OpenAiDriverConfig
 from griptape.structures import Agent
 
 config.drivers = OpenAiDriverConfig()
diff --git a/docs/griptape-framework/structures/src/config_2.py b/docs/griptape-framework/structures/src/config_2.py
index a5f8efbbe..6fcdedbc8 100644
--- a/docs/griptape-framework/structures/src/config_2.py
+++ b/docs/griptape-framework/structures/src/config_2.py
@@ -1,6 +1,7 @@
 import os
 
-from griptape.config import AzureOpenAiDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import AzureOpenAiDriverConfig
 from griptape.structures import Agent
 
 config.drivers = AzureOpenAiDriverConfig(
diff --git a/docs/griptape-framework/structures/src/config_3.py b/docs/griptape-framework/structures/src/config_3.py
index 6b3f51a76..e4e33e379 100644
--- a/docs/griptape-framework/structures/src/config_3.py
+++ b/docs/griptape-framework/structures/src/config_3.py
@@ -2,7 +2,8 @@
 
 import boto3
 
-from griptape.config import AmazonBedrockDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import AmazonBedrockDriverConfig
 from griptape.structures import Agent
 
 config.drivers = AmazonBedrockDriverConfig(
diff --git a/docs/griptape-framework/structures/src/config_4.py b/docs/griptape-framework/structures/src/config_4.py
index 5362b8c6b..7ab5eee70 100644
--- a/docs/griptape-framework/structures/src/config_4.py
+++ b/docs/griptape-framework/structures/src/config_4.py
@@ -1,4 +1,5 @@
-from griptape.config import GoogleDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import GoogleDriverConfig
 from griptape.structures import Agent
 
 config.drivers = GoogleDriverConfig()
diff --git a/docs/griptape-framework/structures/src/config_5.py b/docs/griptape-framework/structures/src/config_5.py
index 4f787a922..bee5050c2 100644
--- a/docs/griptape-framework/structures/src/config_5.py
+++ b/docs/griptape-framework/structures/src/config_5.py
@@ -1,4 +1,5 @@
-from griptape.config import AnthropicDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import AnthropicDriverConfig
 from griptape.structures import Agent
 
 config.drivers = AnthropicDriverConfig()
diff --git a/docs/griptape-framework/structures/src/config_6.py b/docs/griptape-framework/structures/src/config_6.py
index c26502401..569000180 100644
--- a/docs/griptape-framework/structures/src/config_6.py
+++ b/docs/griptape-framework/structures/src/config_6.py
@@ -1,6 +1,7 @@
 import os
 
-from griptape.config import CohereDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import CohereDriverConfig
 from griptape.structures import Agent
 
 config.drivers = CohereDriverConfig(api_key=os.environ["COHERE_API_KEY"])
diff --git a/docs/griptape-framework/structures/src/config_7.py b/docs/griptape-framework/structures/src/config_7.py
index 6b285f0e5..9f464b167 100644
--- a/docs/griptape-framework/structures/src/config_7.py
+++ b/docs/griptape-framework/structures/src/config_7.py
@@ -1,6 +1,7 @@
 import os
 
-from griptape.config import DriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import AnthropicPromptDriver
 from griptape.structures import Agent
 
diff --git a/docs/griptape-framework/structures/src/config_8.py b/docs/griptape-framework/structures/src/config_8.py
index 4f23e3eaa..6bc87998c 100644
--- a/docs/griptape-framework/structures/src/config_8.py
+++ b/docs/griptape-framework/structures/src/config_8.py
@@ -1,4 +1,5 @@
-from griptape.config import AmazonBedrockDriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import AmazonBedrockDriverConfig
 from griptape.structures import Agent
 
 custom_config = AmazonBedrockDriverConfig()
diff --git a/docs/griptape-framework/structures/src/config_logging.py b/docs/griptape-framework/structures/src/config_logging.py
new file mode 100644
index 000000000..81645d5e2
--- /dev/null
+++ b/docs/griptape-framework/structures/src/config_logging.py
@@ -0,0 +1,14 @@
+import logging
+
+from griptape.config import config
+from griptape.config.drivers import OpenAiDriverConfig
+from griptape.config.logging import TruncateLoggingFilter
+from griptape.structures import Agent
+
+config.drivers = OpenAiDriverConfig()
+
+logger = logging.getLogger(config.logging.logger_name)
+logger.setLevel(logging.ERROR)
+logger.addFilter(TruncateLoggingFilter(max_log_length=100))
+
+agent = Agent()
diff --git a/docs/griptape-framework/structures/src/task_memory_6.py b/docs/griptape-framework/structures/src/task_memory_6.py
index 3f4d14b0a..8d39f0286 100644
--- a/docs/griptape-framework/structures/src/task_memory_6.py
+++ b/docs/griptape-framework/structures/src/task_memory_6.py
@@ -1,8 +1,6 @@
 from griptape.artifacts import TextArtifact
-from griptape.config import (
-    OpenAiDriverConfig,
-    config,
-)
+from griptape.config import config
+from griptape.config.drivers import OpenAiDriverConfig
 from griptape.drivers import (
     LocalVectorStoreDriver,
     OpenAiChatPromptDriver,
diff --git a/docs/griptape-tools/official-tools/src/rest_api_tool_1.py b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py
index 2093163b7..4ef73dd9d 100644
--- a/docs/griptape-tools/official-tools/src/rest_api_tool_1.py
+++ b/docs/griptape-tools/official-tools/src/rest_api_tool_1.py
@@ -1,6 +1,7 @@
 from json import dumps
 
-from griptape.config import DriverConfig, config
+from griptape.config import config
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import OpenAiChatPromptDriver
 from griptape.memory.structure import ConversationMemory
 from griptape.structures import Pipeline
diff --git a/griptape/config/__init__.py b/griptape/config/__init__.py
index 4a87c2d01..043d152ba 100644
--- a/griptape/config/__init__.py
+++ b/griptape/config/__init__.py
@@ -1,28 +1,8 @@
 from .base_config import BaseConfig
-
-from .base_driver_config import BaseDriverConfig
-
-from .driver_config import DriverConfig
-from .openai_driver_config import OpenAiDriverConfig
-from .azure_openai_driver_config import AzureOpenAiDriverConfig
-from .amazon_bedrock_driver_config import AmazonBedrockDriverConfig
-from .anthropic_driver_config import AnthropicDriverConfig
-from .google_driver_config import GoogleDriverConfig
-from .cohere_driver_config import CohereDriverConfig
-from .logging_config import LoggingConfig
 from .config import config
 
 
 __all__ = [
     "BaseConfig",
-    "BaseDriverConfig",
-    "DriverConfig",
-    "OpenAiDriverConfig",
-    "AzureOpenAiDriverConfig",
-    "AmazonBedrockDriverConfig",
-    "AnthropicDriverConfig",
-    "GoogleDriverConfig",
-    "CohereDriverConfig",
-    "LoggingConfig",
     "config",
 ]
diff --git a/griptape/config/base_config.py b/griptape/config/base_config.py
index ef62a4e9b..7ed00e445 100644
--- a/griptape/config/base_config.py
+++ b/griptape/config/base_config.py
@@ -8,8 +8,8 @@
 from griptape.mixins.serializable_mixin import SerializableMixin
 
 if TYPE_CHECKING:
-    from .base_driver_config import BaseDriverConfig
-    from .logging_config import LoggingConfig
+    from .drivers.base_driver_config import BaseDriverConfig
+    from .logging.logging_config import LoggingConfig
 
 
 @define(kw_only=True)
diff --git a/griptape/config/config.py b/griptape/config/config.py
index 7b70df409..11c2f9585 100644
--- a/griptape/config/config.py
+++ b/griptape/config/config.py
@@ -5,11 +5,11 @@
 from attrs import define, field
 
 from .base_config import BaseConfig
-from .logging_config import LoggingConfig
-from .openai_driver_config import OpenAiDriverConfig
+from .drivers.openai_driver_config import OpenAiDriverConfig
+from .logging.logging_config import LoggingConfig
 
 if TYPE_CHECKING:
-    from .base_driver_config import BaseDriverConfig
+    from .drivers.base_driver_config import BaseDriverConfig
 
 
 @define(kw_only=True)
diff --git a/griptape/config/drivers/__init__.py b/griptape/config/drivers/__init__.py
new file mode 100644
index 000000000..9d5f2f510
--- /dev/null
+++ b/griptape/config/drivers/__init__.py
@@ -0,0 +1,20 @@
+from .base_driver_config import BaseDriverConfig
+from .driver_config import DriverConfig
+
+from .openai_driver_config import OpenAiDriverConfig
+from .azure_openai_driver_config import AzureOpenAiDriverConfig
+from .amazon_bedrock_driver_config import AmazonBedrockDriverConfig
+from .anthropic_driver_config import AnthropicDriverConfig
+from .google_driver_config import GoogleDriverConfig
+from .cohere_driver_config import CohereDriverConfig
+
+__all__ = [
+    "BaseDriverConfig",
+    "DriverConfig",
+    "OpenAiDriverConfig",
+    "AzureOpenAiDriverConfig",
+    "AmazonBedrockDriverConfig",
+    "AnthropicDriverConfig",
+    "GoogleDriverConfig",
+    "CohereDriverConfig",
+]
diff --git a/griptape/config/amazon_bedrock_driver_config.py b/griptape/config/drivers/amazon_bedrock_driver_config.py
similarity index 98%
rename from griptape/config/amazon_bedrock_driver_config.py
rename to griptape/config/drivers/amazon_bedrock_driver_config.py
index a07300638..ea540b391 100644
--- a/griptape/config/amazon_bedrock_driver_config.py
+++ b/griptape/config/drivers/amazon_bedrock_driver_config.py
@@ -4,7 +4,7 @@
 
 from attrs import Factory, define, field
 
-from griptape.config import DriverConfig
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import (
     AmazonBedrockImageGenerationDriver,
     AmazonBedrockImageQueryDriver,
diff --git a/griptape/config/anthropic_driver_config.py b/griptape/config/drivers/anthropic_driver_config.py
similarity index 96%
rename from griptape/config/anthropic_driver_config.py
rename to griptape/config/drivers/anthropic_driver_config.py
index 642a3fced..0c4524159 100644
--- a/griptape/config/anthropic_driver_config.py
+++ b/griptape/config/drivers/anthropic_driver_config.py
@@ -1,6 +1,6 @@
 from attrs import Factory, define, field
 
-from griptape.config import DriverConfig
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import (
     AnthropicImageQueryDriver,
     AnthropicPromptDriver,
diff --git a/griptape/config/azure_openai_driver_config.py b/griptape/config/drivers/azure_openai_driver_config.py
similarity index 98%
rename from griptape/config/azure_openai_driver_config.py
rename to griptape/config/drivers/azure_openai_driver_config.py
index c987a31b5..bcb173fbd 100644
--- a/griptape/config/azure_openai_driver_config.py
+++ b/griptape/config/drivers/azure_openai_driver_config.py
@@ -4,7 +4,7 @@
 
 from attrs import Factory, define, field
 
-from griptape.config import DriverConfig
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import (
     AzureOpenAiChatPromptDriver,
     AzureOpenAiEmbeddingDriver,
diff --git a/griptape/config/base_driver_config.py b/griptape/config/drivers/base_driver_config.py
similarity index 100%
rename from griptape/config/base_driver_config.py
rename to griptape/config/drivers/base_driver_config.py
diff --git a/griptape/config/cohere_driver_config.py b/griptape/config/drivers/cohere_driver_config.py
similarity index 95%
rename from griptape/config/cohere_driver_config.py
rename to griptape/config/drivers/cohere_driver_config.py
index 7195f550f..eb8a55ce4 100644
--- a/griptape/config/cohere_driver_config.py
+++ b/griptape/config/drivers/cohere_driver_config.py
@@ -1,6 +1,6 @@
 from attrs import Factory, define, field
 
-from griptape.config import DriverConfig
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import (
     BaseEmbeddingDriver,
     BasePromptDriver,
diff --git a/griptape/config/driver_config.py b/griptape/config/drivers/driver_config.py
similarity index 97%
rename from griptape/config/driver_config.py
rename to griptape/config/drivers/driver_config.py
index 325591258..d342ecb0a 100644
--- a/griptape/config/driver_config.py
+++ b/griptape/config/drivers/driver_config.py
@@ -4,7 +4,7 @@
 
 from attrs import Factory, define, field
 
-from griptape.config import BaseDriverConfig
+from griptape.config.drivers import BaseDriverConfig
 from griptape.drivers import (
     DummyAudioTranscriptionDriver,
     DummyEmbeddingDriver,
diff --git a/griptape/config/google_driver_config.py b/griptape/config/drivers/google_driver_config.py
similarity index 94%
rename from griptape/config/google_driver_config.py
rename to griptape/config/drivers/google_driver_config.py
index a1089f0ee..6f4243f01 100644
--- a/griptape/config/google_driver_config.py
+++ b/griptape/config/drivers/google_driver_config.py
@@ -1,6 +1,6 @@
 from attrs import Factory, define, field
 
-from griptape.config import DriverConfig
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import (
     BaseEmbeddingDriver,
     BasePromptDriver,
diff --git a/griptape/config/openai_driver_config.py b/griptape/config/drivers/openai_driver_config.py
similarity index 97%
rename from griptape/config/openai_driver_config.py
rename to griptape/config/drivers/openai_driver_config.py
index 35ccde43d..0b05d1636 100644
--- a/griptape/config/openai_driver_config.py
+++ b/griptape/config/drivers/openai_driver_config.py
@@ -1,6 +1,6 @@
 from attrs import Factory, define, field
 
-from griptape.config import DriverConfig
+from griptape.config.drivers import DriverConfig
 from griptape.drivers import (
     BaseAudioTranscriptionDriver,
     BaseEmbeddingDriver,
diff --git a/griptape/config/logging/__init__.py b/griptape/config/logging/__init__.py
new file mode 100644
index 000000000..de7726060
--- /dev/null
+++ b/griptape/config/logging/__init__.py
@@ -0,0 +1,5 @@
+from .logging_config import LoggingConfig
+from .truncate_logging_filter import TruncateLoggingFilter
+from .newline_logging_filter import NewlineLoggingFilter
+
+__all__ = ["LoggingConfig", "TruncateLoggingFilter", "NewlineLoggingFilter"]
diff --git a/griptape/config/logging_config.py b/griptape/config/logging/logging_config.py
similarity index 53%
rename from griptape/config/logging_config.py
rename to griptape/config/logging/logging_config.py
index 0c0fcc020..80497d7c8 100644
--- a/griptape/config/logging_config.py
+++ b/griptape/config/logging/logging_config.py
@@ -9,16 +9,9 @@
 @define
 class LoggingConfig:
     logger_name: str = field(default="griptape", kw_only=True)
-    logger_level: int = field(
-        default=logging.INFO,
-        kw_only=True,
-        on_setattr=lambda self, _, value: logging.getLogger(self.logger_name).setLevel(value),
-    )
 
     def __attrs_post_init__(self) -> None:
         logger = logging.getLogger(self.logger_name)
-
+        logger.setLevel(logging.INFO)
         logger.propagate = False
-        logger.setLevel(self.logger_level)
-
-        logger.handlers = [RichHandler(show_time=True, show_path=False)]
+        logger.addHandler(RichHandler(show_time=True, show_path=False))
diff --git a/griptape/config/logging/newline_logging_filter.py b/griptape/config/logging/newline_logging_filter.py
new file mode 100644
index 000000000..bae08265f
--- /dev/null
+++ b/griptape/config/logging/newline_logging_filter.py
@@ -0,0 +1,13 @@
+import logging
+from typing import Any
+
+from attrs import define, field
+
+
+@define
+class NewlineLoggingFilter(logging.Filter):
+    replace_str: str = field(default=" ", kw_only=True)
+
+    def filter(self, record: Any) -> bool:
+        record.msg = record.msg.replace("\n", self.replace_str)
+        return True
diff --git a/griptape/config/logging/truncate_logging_filter.py b/griptape/config/logging/truncate_logging_filter.py
new file mode 100644
index 000000000..9888fc169
--- /dev/null
+++ b/griptape/config/logging/truncate_logging_filter.py
@@ -0,0 +1,17 @@
+import logging
+from typing import Any
+
+from attrs import define, field
+
+
+@define
+class TruncateLoggingFilter(logging.Filter):
+    max_log_length: int = field(default=1000, kw_only=True)
+
+    def filter(self, record: Any) -> bool:
+        message = record.getMessage()
+
+        if len(message) > self.max_log_length:
+            record.msg = f"{message[:self.max_log_length]}... [{len(message) - self.max_log_length} more characters]"
+            record.args = ()
+        return True


Test patch:
diff --git a/tests/mocks/mock_driver_config.py b/tests/mocks/mock_driver_config.py
index 6b152721d..20f2ac684 100644
--- a/tests/mocks/mock_driver_config.py
+++ b/tests/mocks/mock_driver_config.py
@@ -1,6 +1,6 @@
 from attrs import Factory, define, field
 
-from griptape.config import DriverConfig
+from griptape.config.drivers import DriverConfig
 from griptape.drivers.vector.local_vector_store_driver import LocalVectorStoreDriver
 from tests.mocks.mock_embedding_driver import MockEmbeddingDriver
 from tests.mocks.mock_image_generation_driver import MockImageGenerationDriver
diff --git a/tests/unit/config/drivers/__init__.py b/tests/unit/config/drivers/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/unit/config/test_amazon_bedrock_driver_config.py b/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py
similarity index 98%
rename from tests/unit/config/test_amazon_bedrock_driver_config.py
rename to tests/unit/config/drivers/test_amazon_bedrock_driver_config.py
index 57a80809e..a76eeb278 100644
--- a/tests/unit/config/test_amazon_bedrock_driver_config.py
+++ b/tests/unit/config/drivers/test_amazon_bedrock_driver_config.py
@@ -1,7 +1,7 @@
 import boto3
 import pytest
 
-from griptape.config import AmazonBedrockDriverConfig
+from griptape.config.drivers import AmazonBedrockDriverConfig
 from tests.utils.aws import mock_aws_credentials
 
 
diff --git a/tests/unit/config/test_anthropic_driver_config.py b/tests/unit/config/drivers/test_anthropic_driver_config.py
similarity index 96%
rename from tests/unit/config/test_anthropic_driver_config.py
rename to tests/unit/config/drivers/test_anthropic_driver_config.py
index a2ccbd25b..a496c47b7 100644
--- a/tests/unit/config/test_anthropic_driver_config.py
+++ b/tests/unit/config/drivers/test_anthropic_driver_config.py
@@ -1,6 +1,6 @@
 import pytest
 
-from griptape.config import AnthropicDriverConfig
+from griptape.config.drivers import AnthropicDriverConfig
 
 
 class TestAnthropicDriverConfig:
diff --git a/tests/unit/config/test_azure_openai_driver_config.py b/tests/unit/config/drivers/test_azure_openai_driver_config.py
similarity index 98%
rename from tests/unit/config/test_azure_openai_driver_config.py
rename to tests/unit/config/drivers/test_azure_openai_driver_config.py
index 3c88b859d..ef418e097 100644
--- a/tests/unit/config/test_azure_openai_driver_config.py
+++ b/tests/unit/config/drivers/test_azure_openai_driver_config.py
@@ -1,6 +1,6 @@
 import pytest
 
-from griptape.config import AzureOpenAiDriverConfig
+from griptape.config.drivers import AzureOpenAiDriverConfig
 
 
 class TestAzureOpenAiDriverConfig:
diff --git a/tests/unit/config/test_cohere_driver_config.py b/tests/unit/config/drivers/test_cohere_driver_config.py
similarity index 96%
rename from tests/unit/config/test_cohere_driver_config.py
rename to tests/unit/config/drivers/test_cohere_driver_config.py
index 9e8407d84..5a75c98cd 100644
--- a/tests/unit/config/test_cohere_driver_config.py
+++ b/tests/unit/config/drivers/test_cohere_driver_config.py
@@ -1,6 +1,6 @@
 import pytest
 
-from griptape.config import CohereDriverConfig
+from griptape.config.drivers import CohereDriverConfig
 
 
 class TestCohereDriverConfig:
diff --git a/tests/unit/config/test_driver_config.py b/tests/unit/config/drivers/test_driver_config.py
similarity index 96%
rename from tests/unit/config/test_driver_config.py
rename to tests/unit/config/drivers/test_driver_config.py
index dd3fd1a47..71220646f 100644
--- a/tests/unit/config/test_driver_config.py
+++ b/tests/unit/config/drivers/test_driver_config.py
@@ -1,6 +1,6 @@
 import pytest
 
-from griptape.config import DriverConfig
+from griptape.config.drivers import DriverConfig
 
 
 class TestDriverConfig:
diff --git a/tests/unit/config/test_google_driver_config.py b/tests/unit/config/drivers/test_google_driver_config.py
similarity index 97%
rename from tests/unit/config/test_google_driver_config.py
rename to tests/unit/config/drivers/test_google_driver_config.py
index fb6cd23b5..3a16173b5 100644
--- a/tests/unit/config/test_google_driver_config.py
+++ b/tests/unit/config/drivers/test_google_driver_config.py
@@ -1,6 +1,6 @@
 import pytest
 
-from griptape.config import GoogleDriverConfig
+from griptape.config.drivers import GoogleDriverConfig
 
 
 class TestGoogleDriverConfig:
diff --git a/tests/unit/config/test_openai_driver_config.py b/tests/unit/config/drivers/test_openai_driver_config.py
similarity index 98%
rename from tests/unit/config/test_openai_driver_config.py
rename to tests/unit/config/drivers/test_openai_driver_config.py
index 55156730c..860f70518 100644
--- a/tests/unit/config/test_openai_driver_config.py
+++ b/tests/unit/config/drivers/test_openai_driver_config.py
@@ -1,6 +1,6 @@
 import pytest
 
-from griptape.config import OpenAiDriverConfig
+from griptape.config.drivers import OpenAiDriverConfig
 
 
 class TestOpenAiDriverConfig:
diff --git a/tests/unit/config/logging/__init__.py b/tests/unit/config/logging/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/unit/config/logging/test_newline_logging_filter.py b/tests/unit/config/logging/test_newline_logging_filter.py
new file mode 100644
index 000000000..d5b05e323
--- /dev/null
+++ b/tests/unit/config/logging/test_newline_logging_filter.py
@@ -0,0 +1,20 @@
+import io
+import logging
+from contextlib import redirect_stdout
+
+from griptape.config import config
+from griptape.config.logging import NewlineLoggingFilter
+from griptape.structures import Agent
+
+
+class TestNewlineLoggingFilter:
+    def test_filter(self):
+        # use the filter in an Agent
+        logger = logging.getLogger(config.logging.logger_name)
+        logger.addFilter(NewlineLoggingFilter(replace_str="$$$"))
+        agent = Agent()
+        # use a context manager to capture the stdout
+        with io.StringIO() as buf, redirect_stdout(buf):
+            agent.run()
+            output = buf.getvalue()
+            assert "$$$" in output
diff --git a/tests/unit/config/logging/test_truncate_logging_filter.py b/tests/unit/config/logging/test_truncate_logging_filter.py
new file mode 100644
index 000000000..fc0aa1c47
--- /dev/null
+++ b/tests/unit/config/logging/test_truncate_logging_filter.py
@@ -0,0 +1,20 @@
+import io
+import logging
+from contextlib import redirect_stdout
+
+from griptape.config import config
+from griptape.config.logging import TruncateLoggingFilter
+from griptape.structures import Agent
+
+
+class TestTruncateLoggingFilter:
+    def test_filter(self):
+        # use the filter in an Agent
+        logger = logging.getLogger(config.logging.logger_name)
+        logger.addFilter(TruncateLoggingFilter(max_log_length=0))
+        agent = Agent()
+        # use a context manager to capture the stdout
+        with io.StringIO() as buf, redirect_stdout(buf):
+            agent.run("test")
+            output = buf.getvalue()
+            assert "more characters]" in output
diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py
index ecd02e1a1..04d5586d2 100644
--- a/tests/unit/config/test_config.py
+++ b/tests/unit/config/test_config.py
@@ -1,12 +1,13 @@
 import pytest
 
-from griptape.config.openai_driver_config import OpenAiDriverConfig
+from griptape.config.drivers import OpenAiDriverConfig
 
 
 class TestConfig:
     @pytest.mark.skip_mock_config()
     def test_init(self):
-        from griptape.config import LoggingConfig, config
+        from griptape.config import config
+        from griptape.config.logging import LoggingConfig
 
         assert isinstance(config.drivers, OpenAiDriverConfig)
         assert isinstance(config.logging, LoggingConfig)