diff --git a/config/config.go b/config/config.go
index 1176876..12b934d 100644
--- a/config/config.go
+++ b/config/config.go
@@ -6,6 +6,7 @@
 
 	"github.com/KorAP/KoralPipe-TermMapper/ast"
 	"github.com/KorAP/KoralPipe-TermMapper/parser"
+	"github.com/rs/zerolog/log"
 	"gopkg.in/yaml.v3"
 )
 
@@ -96,20 +97,24 @@
 	for _, file := range mappingFiles {
 		data, err := os.ReadFile(file)
 		if err != nil {
-			return nil, fmt.Errorf("failed to read mapping file '%s': %w", file, err)
+			log.Error().Err(err).Str("file", file).Msg("Failed to read mapping file")
+			continue
 		}
 
 		if len(data) == 0 {
-			return nil, fmt.Errorf("EOF: mapping file '%s' is empty", file)
+			log.Error().Err(err).Str("file", file).Msg("EOF: mapping file is empty")
+			continue
 		}
 
 		var list MappingList
 		if err := yaml.Unmarshal(data, &list); err != nil {
-			return nil, fmt.Errorf("failed to parse YAML mapping file '%s': %w", file, err)
+			log.Error().Err(err).Str("file", file).Msg("Failed to parse YAML mapping file")
+			continue
 		}
 
 		if seenIDs[list.ID] {
-			return nil, fmt.Errorf("duplicate mapping list ID found: %s", list.ID)
+			log.Error().Err(err).Str("file", file).Str("list-id", list.ID).Msg("Duplicate mapping list ID found")
+			continue
 		}
 		seenIDs[list.ID] = true
 		allLists = append(allLists, list)
diff --git a/config/config_test.go b/config/config_test.go
index 329712c..706e1e6 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -1,10 +1,12 @@
 package config
 
 import (
+	"bytes"
 	"os"
 	"testing"
 
 	"github.com/KorAP/KoralPipe-TermMapper/ast"
+	"github.com/rs/zerolog/log"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
@@ -763,6 +765,14 @@
 }
 
 func TestLoadFromSourcesDuplicateIDs(t *testing.T) {
+	// Set up a buffer to capture log output
+	var buf bytes.Buffer
+	originalLogger := log.Logger
+	defer func() {
+		log.Logger = originalLogger
+	}()
+	log.Logger = log.Logger.Output(&buf)
+
 	// Create config with duplicate IDs across sources
 	configContent := `
 lists:
@@ -793,9 +803,21 @@
 	err = mappingFile.Close()
 	require.NoError(t, err)
 
-	_, err = LoadFromSources(configFile.Name(), []string{mappingFile.Name()})
-	require.Error(t, err)
-	assert.Contains(t, err.Error(), "duplicate mapping list ID found: duplicate-id")
+	// The function should now succeed but log the duplicate ID error
+	config, err := LoadFromSources(configFile.Name(), []string{mappingFile.Name()})
+	require.NoError(t, err)
+	require.NotNil(t, config)
+
+	// Check that the duplicate ID error was logged
+	logOutput := buf.String()
+	assert.Contains(t, logOutput, "Duplicate mapping list ID found")
+	assert.Contains(t, logOutput, "duplicate-id")
+
+	// Only the first mapping list (from config file) should be loaded
+	require.Len(t, config.Lists, 1)
+	assert.Equal(t, "duplicate-id", config.Lists[0].ID)
+	// Check that it's the one from the config file (has mapping "[A] <> [B]")
+	assert.Equal(t, "[A] <> [B]", string(config.Lists[0].Mappings[0]))
 }
 
 func TestLoadFromSourcesConfigWithOnlyPort(t *testing.T) {
